29
29
from ansys .mapdl .core import LOG
30
30
from ansys .mapdl .core .errors import MapdlDidNotStart
31
31
from ansys .mapdl .core .launcher .grpc import launch_grpc
32
- from ansys .mapdl .core .launcher .local import processing_local_arguments
33
32
from ansys .mapdl .core .launcher .tools import (
34
33
generate_start_parameters ,
35
34
get_port ,
36
35
submitter ,
37
36
)
38
- from ansys .mapdl .core .licensing import LicenseChecker
39
37
from ansys .mapdl .core .mapdl_grpc import MapdlGrpc
40
38
41
39
LAUNCH_ON_HCP_ERROR_MESSAGE_IP = (
@@ -272,7 +270,7 @@ def get_state_from_scontrol(stdout: str) -> str:
272
270
return stdout .split ("JobState=" )[1 ].splitlines ()[0 ].strip ()
273
271
274
272
275
- def launch_mapdl_on_cluster (
273
+ def launch_mapdl_on_cluster_locally (
276
274
nproc : int ,
277
275
* ,
278
276
scheduler_options : Union [str , Dict [str , str ]] = None ,
@@ -291,6 +289,9 @@ def launch_mapdl_on_cluster(
291
289
A string or dictionary specifying the job configuration for the
292
290
scheduler. For example ``scheduler_options = "-N 10"``.
293
291
292
+ launch_mapdl_args : Dict[str, Any], optional
293
+ Any keyword argument from the :func:`ansys.mapdl.core.launcher.grpc.launch_mapdl_grpc` function.
294
+
294
295
Returns
295
296
-------
296
297
MapdlGrpc
@@ -309,10 +310,18 @@ def launch_mapdl_on_cluster(
309
310
)
310
311
311
312
"""
312
- from ansys .mapdl .core .launcher import launch_mapdl
313
+ # from ansys.mapdl.core.launcher import launch_mapdl
313
314
314
315
# Processing the arguments
315
316
launch_mapdl_args ["launch_on_hpc" ] = True
317
+ launch_mapdl_args ["running_on_hpc" ] = True
318
+
319
+ if launch_mapdl_args .get ("license_server_check" , False ):
320
+ raise ValueError (
321
+ "The argument 'license_server_check' is not allowed when launching on an HPC platform."
322
+ )
323
+
324
+ launch_mapdl_args ["license_server_check" ] = False
316
325
317
326
if launch_mapdl_args .get ("mode" , "grpc" ) != "grpc" :
318
327
raise ValueError (
@@ -327,32 +336,254 @@ def launch_mapdl_on_cluster(
327
336
"The 'start_instance' argument must be 'True' when launching on HPC."
328
337
)
329
338
330
- return launch_mapdl (
339
+ if launch_mapdl_args .get ("mapdl_output" , False ):
340
+ raise ValueError (
341
+ "The 'mapdl_output' argument is not allowed when launching on an HPC platform."
342
+ )
343
+
344
+ return launch_mapdl_grpc_on_hpc (
331
345
nproc = nproc ,
332
346
scheduler_options = scheduler_options ,
333
347
** launch_mapdl_args ,
334
348
)
335
349
336
350
337
- def launch_mapdl_grpc (): # to be fixed
338
- args = processing_local_arguments (locals ())
351
+ def launch_mapdl_grpc_on_hpc (
352
+ * ,
353
+ exec_file : Optional [str ] = None ,
354
+ run_location : Optional [str ] = None ,
355
+ jobname : str = "file" ,
356
+ nproc : Optional [int ] = None ,
357
+ ram : Optional [Union [int , str ]] = None ,
358
+ mode : Optional [str ] = None ,
359
+ override : bool = False ,
360
+ loglevel : str = "ERROR" ,
361
+ additional_switches : str = "" ,
362
+ start_timeout : Optional [int ] = None ,
363
+ port : Optional [int ] = None ,
364
+ cleanup_on_exit : bool = True ,
365
+ start_instance : Optional [bool ] = None ,
366
+ clear_on_connect : bool = True ,
367
+ log_apdl : Optional [Union [bool , str ]] = None ,
368
+ remove_temp_dir_on_exit : bool = False ,
369
+ license_server_check : bool = False ,
370
+ license_type : Optional [bool ] = None ,
371
+ print_com : bool = False ,
372
+ add_env_vars : Optional [Dict [str , str ]] = None ,
373
+ replace_env_vars : Optional [Dict [str , str ]] = None ,
374
+ version : Optional [Union [int , str ]] = None ,
375
+ running_on_hpc : bool = True ,
376
+ launch_on_hpc : bool = False ,
377
+ ** kwargs : Dict [str , Any ],
378
+ ) -> MapdlGrpc :
379
+ """Start MAPDL locally with gRPC interface.
380
+
381
+ Parameters
382
+ ----------
383
+ exec_file : str, optional
384
+ The location of the MAPDL executable. Will use the cached
385
+ location when left at the default :class:`None` and no environment
386
+ variable is set.
387
+
388
+ The executable path can be also set through the environment variable
389
+ :envvar:`PYMAPDL_MAPDL_EXEC`. For example:
390
+
391
+ .. code:: console
392
+
393
+ export PYMAPDL_MAPDL_EXEC=/ansys_inc/v211/ansys/bin/mapdl
394
+
395
+ run_location : str, optional
396
+ MAPDL working directory. Defaults to a temporary working
397
+ directory. If directory doesn't exist, one is created.
398
+
399
+ jobname : str, optional
400
+ MAPDL jobname. Defaults to ``'file'``.
401
+
402
+ nproc : int, optional
403
+ Number of processors. Defaults to ``2``. If running on an HPC cluster,
404
+ this value is adjusted to the number of CPUs allocated to the job,
405
+ unless the argument ``running_on_hpc`` is set to ``"false"``.
406
+
407
+ ram : float, optional
408
+ Total size in megabytes of the workspace (memory) used for the initial
409
+ allocation. The default is :class:`None`, in which case 2 GB (2048 MB) is
410
+ used. To force a fixed size throughout the run, specify a negative
411
+ number.
412
+
413
+ mode : str, optional
414
+ Mode to launch MAPDL. Must be one of the following:
415
+
416
+ - ``'grpc'``
417
+ - ``'console'``
418
+
419
+ The ``'grpc'`` mode is available on ANSYS 2021R1 or newer and
420
+ provides the best performance and stability.
421
+ The ``'console'`` mode is for legacy use only Linux only prior to 2020R2.
422
+ This console mode is pending depreciation.
423
+ Visit :ref:`versions_and_interfaces` for more information.
424
+
425
+ override : bool, optional
426
+ Attempts to delete the lock file at the ``run_location``.
427
+ Useful when a prior MAPDL session has exited prematurely and
428
+ the lock file has not been deleted.
429
+
430
+ loglevel : str, optional
431
+ Sets which messages are printed to the console. ``'INFO'``
432
+ prints out all ANSYS messages, ``'WARNING'`` prints only
433
+ messages containing ANSYS warnings, and ``'ERROR'`` logs only
434
+ error messages.
435
+
436
+ additional_switches : str, optional
437
+ Additional switches for MAPDL, for example ``'aa_r'``, the
438
+ academic research license, would be added with:
439
+
440
+ - ``additional_switches="-aa_r"``
441
+
442
+ Avoid adding switches like ``-i``, ``-o`` or ``-b`` as these are already
443
+ included to start up the MAPDL server. See the notes
444
+ section for additional details.
445
+
446
+ start_timeout : float, optional
447
+ Maximum allowable time to connect to the MAPDL server. By default it is
448
+ 45 seconds, however, it is increased to 90 seconds if running on HPC.
449
+
450
+ port : int
451
+ Port to launch MAPDL gRPC on. Final port will be the first
452
+ port available after (or including) this port. Defaults to
453
+ ``50052``. You can also provide this value through the environment variable
454
+ :envvar:`PYMAPDL_PORT`. For instance ``PYMAPDL_PORT=50053``.
455
+ However the argument (if specified) has precedence over the environment
456
+ variable. If this environment variable is empty, it is as it is not set.
457
+
458
+ cleanup_on_exit : bool, optional
459
+ Exit MAPDL when python exits or the mapdl Python instance is
460
+ garbage collected.
461
+
462
+ start_instance : bool, optional
463
+ When :class:`False`, connect to an existing MAPDL instance at ``ip``
464
+ and ``port``, which default to ip ``'127.0.0.1'`` at port ``50052``.
465
+ Otherwise, launch a local instance of MAPDL. You can also
466
+ provide this value through the environment variable
467
+ :envvar:`PYMAPDL_START_INSTANCE`.
468
+ However the argument (if specified) has precedence over the environment
469
+ variable. If this environment variable is empty, it is as it is not set.
470
+
471
+ clear_on_connect : bool, optional
472
+ Defaults to :class:`True`, giving you a fresh environment when
473
+ connecting to MAPDL. When if ``start_instance`` is specified
474
+ it defaults to :class:`False`.
475
+
476
+ log_apdl : str, optional
477
+ Enables logging every APDL command to the local disk. This
478
+ can be used to "record" all the commands that are sent to
479
+ MAPDL via PyMAPDL so a script can be run within MAPDL without
480
+ PyMAPDL. This argument is the path of the output file (e.g.
481
+ ``log_apdl='pymapdl_log.txt'``). By default this is disabled.
482
+
483
+ remove_temp_dir_on_exit : bool, optional
484
+ When ``run_location`` is :class:`None`, this launcher creates a new MAPDL
485
+ working directory within the user temporary directory, obtainable with
486
+ ``tempfile.gettempdir()``. When this parameter is
487
+ :class:`True`, this directory will be deleted when MAPDL is exited.
488
+ Default to :class:`False`.
489
+ If you change the working directory, PyMAPDL does not delete the original
490
+ working directory nor the new one.
491
+
492
+ license_server_check : bool, optional
493
+ Check if the license server is available if MAPDL fails to
494
+ start. Only available on ``mode='grpc'``. Defaults :class:`False`.
495
+
496
+ license_type : str, optional
497
+ Enable license type selection. You can input a string for its
498
+ license name (for example ``'meba'`` or ``'ansys'``) or its description
499
+ ("enterprise solver" or "enterprise" respectively).
500
+ You can also use legacy licenses (for example ``'aa_t_a'``) but it will
501
+ also raise a warning. If it is not used (:class:`None`), no specific
502
+ license will be requested, being up to the license server to provide a
503
+ specific license type. Default is :class:`None`.
504
+
505
+ print_com : bool, optional
506
+ Print the command ``/COM`` arguments to the standard output.
507
+ Default :class:`False`.
508
+
509
+ add_env_vars : dict, optional
510
+ The provided dictionary will be used to extend the MAPDL process
511
+ environment variables. If you want to control all of the environment
512
+ variables, use the argument ``replace_env_vars``.
513
+ Defaults to :class:`None`.
514
+
515
+ replace_env_vars : dict, optional
516
+ The provided dictionary will be used to replace all the MAPDL process
517
+ environment variables. It replace the system environment variables
518
+ which otherwise would be used in the process.
519
+ To just add some environment variables to the MAPDL
520
+ process, use ``add_env_vars``. Defaults to :class:`None`.
521
+
522
+ version : float, optional
523
+ Version of MAPDL to launch. If :class:`None`, the latest version is used.
524
+ Versions can be provided as integers (i.e. ``version=222``) or
525
+ floats (i.e. ``version=22.2``).
526
+ To retrieve the available installed versions, use the function
527
+ :meth:`ansys.tools.path.path.get_available_ansys_installations`.
528
+ You can also provide this value through the environment variable
529
+ :envvar:`PYMAPDL_MAPDL_VERSION`.
530
+ For instance ``PYMAPDL_MAPDL_VERSION=22.2``.
531
+ However the argument (if specified) has precedence over the environment
532
+ variable. If this environment variable is empty, it is as it is not set.
533
+
534
+ kwargs : dict, Optional
535
+ These keyword arguments are interface-specific or for
536
+ development purposes. For more information, see Notes.
537
+
538
+ scheduler_options : :class:`str`, :class:`dict`
539
+ Use it to specify options to the scheduler run command. It can be a
540
+ string or a dictionary with arguments and its values (both as strings).
541
+ For more information visit :ref:`ref_hpc_slurm`.
542
+
543
+ set_no_abort : :class:`bool`
544
+ *(Development use only)*
545
+ Sets MAPDL to not abort at the first error within /BATCH mode.
546
+ Defaults to :class:`True`.
547
+
548
+ force_intel : :class:`bool`
549
+ *(Development use only)*
550
+ Forces the use of Intel message pass interface (MPI) in versions between
551
+ Ansys 2021R0 and 2022R2, where because of VPNs issues this MPI is
552
+ deactivated by default.
553
+ See :ref:`vpn_issues_troubleshooting` for more information.
554
+ Defaults to :class:`False`.
555
+
556
+ Returns
557
+ -------
558
+ MapdlGrpc
559
+ An instance of Mapdl.
560
+ """
561
+ args = pack_arguments (locals ()) # packs args and kwargs
562
+
563
+ check_kwargs (args ) # check if passing wrong key arguments
564
+
565
+ pre_check_args (args )
566
+
567
+ if is_running_on_slurm (args ):
568
+ LOG .info ("On Slurm mode." )
569
+
570
+ # extracting parameters
571
+ get_slurm_options (args , kwargs )
572
+
573
+ get_start_instance_arg (args )
574
+
575
+ get_cpus (args )
576
+
577
+ get_ip (args )
578
+
579
+ args ["port" ] = get_port (args ["port" ], args ["start_instance" ])
580
+
339
581
if args .get ("mode" , "grpc" ) != "grpc" :
340
582
raise ValueError ("Invalid 'mode'." )
341
583
args ["port" ] = get_port (args ["port" ], args ["start_instance" ])
342
584
343
585
start_parm = generate_start_parameters (args )
344
586
345
- # Early exit for debugging.
346
- if args ["_debug_no_launch" ]:
347
- # Early exit, just for testing
348
- return args # type: ignore
349
-
350
- # Check the license server
351
- if args ["license_server_check" ]:
352
- LOG .debug ("Checking license server." )
353
- lic_check = LicenseChecker (timeout = args ["start_timeout" ])
354
- lic_check .start ()
355
-
356
587
########################################
357
588
# Launch MAPDL with gRPC
358
589
# ----------------------
@@ -387,27 +618,16 @@ def launch_mapdl_grpc(): # to be fixed
387
618
388
619
jobid : int = start_parm .get ("jobid" , "Not found" )
389
620
390
- if (
391
- args ["launch_on_hpc" ]
392
- and start_parm .get ("finish_job_on_exit" , True )
393
- and jobid not in ["Not found" , None ]
394
- ):
621
+ if start_parm .get ("finish_job_on_exit" , True ) and jobid not in [
622
+ "Not found" ,
623
+ None ,
624
+ ]:
395
625
396
626
LOG .debug (f"Killing HPC job with id: { jobid } " )
397
627
kill_job (jobid )
398
628
399
- if args ["license_server_check" ]:
400
- LOG .debug ("Checking license server." )
401
- lic_check .check ()
402
-
403
629
raise exception
404
630
405
- if args ["just_launch" ]:
406
- out = [args ["ip" ], args ["port" ]]
407
- if hasattr (process , "pid" ):
408
- out += [process .pid ]
409
- return out
410
-
411
631
########################################
412
632
# Connect to MAPDL using gRPC
413
633
# ---------------------------
@@ -425,7 +645,10 @@ def launch_mapdl_grpc(): # to be fixed
425
645
)
426
646
427
647
except Exception as exception :
428
- LOG .error ("An error occurred when connecting to MAPDL." )
648
+ jobid = start_parm .get ("jobid" , "'Not found'" )
649
+ LOG .error (
650
+ f"An error occurred when connecting to the MAPDL instance running on job { jobid } ."
651
+ )
429
652
raise exception
430
653
431
654
return mapdl
0 commit comments