Initialize Module
for minimizer, accept step if dW<dW_allowed*W_MHD(iter=0) default +10e-10 choice phi=Phi_edge * s
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(t_functional_mhd3d), | intent(inout) | :: | sf |
SUBROUTINE InitMHD3D(sf) ! MODULES USE MODgvec_MHD3D_Vars USE MODgvec_Globals , ONLY: TWOPI USE MODgvec_sgrid , ONLY: t_sgrid USE MODgvec_base , ONLY: base_new USE MODgvec_boundaryFromFile, ONLY: boundaryFromFile_new USE MODgvec_hmap , ONLY: hmap_new,hmap_new_auxvar USE MODgvec_VMEC , ONLY: InitVMEC USE MODgvec_VMEC_vars , ONLY: vmec_iota_profile,vmec_pres_profile USE MODgvec_VMEC_Readin , ONLY: nfp,nFluxVMEC,Phi,xm,xn,lasym,mpol,ntor !<<< only exists on MPIroot! USE MODgvec_MHD3D_EvalFunc , ONLY: InitializeMHD3D_EvalFunc USE MODgvec_ReadInTools , ONLY: GETSTR,GETLOGICAL,GETINT,GETINTARRAY,GETREAL,GETREALALLOCARRAY, GETREALARRAY USE MODgvec_MPI , ONLY: par_BCast,par_barrier USE MODgvec_rProfile_poly , ONLY: t_rProfile_poly USE MODgvec_MHD3D_minimize , ONLY: new_minimizer IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES CLASS(t_functional_mhd3d), INTENT(INOUT) :: sf !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iMode,nElems,n_sgrid_rho INTEGER :: grid_type REAL(wp),ALLOCATABLE :: sgrid_rho(:) INTEGER :: X1X2_deg,X1X2_cont INTEGER :: X1_mn_max(2),X2_mn_max(2) INTEGER :: LA_deg,LA_cont,LA_mn_max(2) CHARACTER(LEN=8) :: X1_sin_cos CHARACTER(LEN=8) :: X2_sin_cos CHARACTER(LEN=8) :: LA_sin_cos INTEGER :: degGP,mn_nyq(2),mn_nyq_min(2),fac_nyq INTEGER :: nfp_loc INTEGER :: X1X2_BCtype_axis(0:4),LA_BCtype_axis(0:4) INTEGER :: proposal_mn_max(1:2)=(/2,0/) !!default proposals, changed for VMEC input to automatically match input! CHARACTER(LEN=8) :: proposal_X1_sin_cos="_cos_" !!default proposals, changed for VMEC input to automatically match input! CHARACTER(LEN=8) :: proposal_X2_sin_cos="_sin_" !!default proposals, changed for VMEC input to automatically match input! CHARACTER(LEN=8) :: proposal_LA_sin_cos="_sin_" !!default proposals, changed for VMEC input to automatically match input! REAL(wp) :: scale_minor_radius CHARACTER(LEN=255) ::boundary_filename CHARACTER(LEN=8) :: boundary_perturb_type_str !! readin variable for boundary_perturb_type: legacy, cosm INTEGER :: varsize_for_dofs(6) !=================================================================================================================================== CALL enter_subregion("init-MHD3D") CALL par_Barrier(beforeScreenOut='INIT MHD3D ...') which_init = GETINT("whichInitEquilibrium",0) IF(which_init.EQ.1) CALL InitVMEC() !-----------MINIMIZER MinimizerType= GETINT("MinimizerType",Proposal=10) PrecondType = GETINT("PrecondType",Proposal=1) dW_allowed=GETREAL("dW_allowed",Proposal=1.0e-10_wp) !! for minimizer, accept step if dW<dW_allowed*W_MHD(iter=0) default +10e-10 maxIter = GETINT("maxIter",Proposal=5000) outputIter= GETINT("outputIter",Proposal=maxIter) logIter = GETINT("logIter",Proposal=maxIter) nlogScreen= GETINT("nLogScreen",Proposal=1) minimize_tol =GETREAL("minimize_tol",Proposal=1.0e-12_wp) start_dt =GETREAL("start_dt",Proposal=0.1_wp) doCheckDistance=GETLOGICAL("doCheckDistance",Proposal=.FALSE.) doCheckAxis=GETLOGICAL("doCheckAxis",Proposal=.TRUE.) !----------- fac_nyq = GETINT( "fac_nyq",Proposal=4) !constants mu_0 = 2.0e-07_wp*TWOPI gamm = 0.0_wp !fixed! sgammM1=1.0_wp/(gamm-1.0_wp) init_LA= GETLOGICAL("init_LA",Proposal=.TRUE.) SELECT CASE(which_init) CASE(0) init_fromBConly= .TRUE. init_BC = 2 !hmap which_hmap=GETINT("which_hmap",Proposal=1) CALL hmap_new(hmap,which_hmap) IF(hmap%nfp.NE.-1)THEN nfp_loc = hmap%nfp ELSE nfp_loc = GETINT("nfp") END IF Phi_edge = GETREAL("PHIEDGE",Proposal=1.0_wp) Phi_edge = Phi_edge/TWOPI !normalization like in VMEC!!! IF(MPIroot)THEN CALL InitProfile(sf,"iota",iota_profile) CALL InitProfile(sf,"pres",pres_profile) END IF CASE(1) !VMEC init init_fromBConly= GETLOGICAL("init_fromBConly",Proposal=.FALSE.) IF(init_fromBConly)THEN !=-1, keep vmec axis and boundary, =0: keep vmec boundary, overwrite axis, =1: keep vmec axis, overwrite boundary, =2: overwrite axis and boundary init_BC= GETINT("reinit_BC",Proposal=-1) ELSE init_BC=-1 END IF IF(MPIroot)THEN init_with_profile_iota = GETLOGICAL("init_with_profile_iota", Proposal=.FALSE.) IF(init_with_profile_iota)THEN CALL InitProfile(sf,"iota",iota_profile) ELSE iota_profile=vmec_iota_profile END IF ! iota from parameterfile init_with_profile_pressure = GETLOGICAL("init_with_profile_pressure", Proposal=.FALSE.) IF(init_with_profile_pressure)THEN CALL InitProfile(sf,"pres",pres_profile) ELSE pres_profile=vmec_pres_profile END IF ! pressure from parameterfile proposal_mn_max(:)=(/mpol-1,ntor/) IF(lasym)THEN !asymmetric proposal_X1_sin_cos="_sincos_" proposal_X2_sin_cos="_sincos_" proposal_LA_sin_cos="_sincos_" END IF nfp_loc = nfp Phi_edge = Phi(nFluxVMEC) END IF !MPIroot which_hmap=1 !hmap_RZ CALL hmap_new(hmap,which_hmap) END SELECT !which_init IF(MPIroot)THEN Phi_profile=t_rProfile_poly((/0.0_wp,Phi_edge/)) !! choice phi=Phi_edge * s !iota= (dChi/ds) / (dPhi/ds) = dchi_ds / Phi_edge => chi = Phi_edge * int(iota ds) chi_profile=iota_profile%antiderivative() chi_profile%coefs=chi_profile%coefs*Phi_edge END IF !MPIroot getBoundaryFromFile=GETINT("getBoundaryFromFile",Proposal=-1) ! =-1: OFF, get X1b and X2b from parameterfile. 1: get boundary from specific netcdf file SELECT CASE(getBoundaryFromFile) CASE(-1) !do nothing CASE(1) boundary_filename=GETSTR("boundary_filename") scale_minor_radius=GETREAL("scale_minor_radius",Proposal=1.0_wp) IF(MPIroot)THEN CALL boundaryFromFile_new(BFF,boundary_filename) IF(nfp_loc.NE.BFF%nfp) WRITE(UNIT_stdOut,'(6X,A,I4)')'INFO: changed to boundary file NFP= ',BFF%nfp nfp_loc=BFF%nfp proposal_mn_max(:)=(/BFF%m_max,BFF%n_max/) IF(BFF%lasym.EQ.1)THEN !asymmetric proposal_X1_sin_cos="_sincos_" proposal_X2_sin_cos="_sincos_" proposal_LA_sin_cos="_sincos_" END IF END IF END SELECT CALL par_BCast(proposal_mn_max,0) CALL par_BCast(proposal_X1_sin_cos,0) CALL par_BCast(proposal_X2_sin_cos,0) CALL par_BCast(proposal_LA_sin_cos,0) CALL par_BCast(nfp_loc,0) CALL enter_subregion("discretization") X1X2_deg = GETINT( "X1X2_deg") X1X2_cont = GETINT( "X1X2_continuity",Proposal=(X1X2_deg-1) ) X1_mn_max = GETINTARRAY("X1_mn_max" ,2 ,Proposal=proposal_mn_max) X2_mn_max = GETINTARRAY("X2_mn_max" ,2 ,Proposal=proposal_mn_max) X1_sin_cos = GETSTR( "X1_sin_cos" ,Proposal=proposal_X1_sin_cos) !_sin_,_cos_,_sin_cos_ X2_sin_cos = GETSTR( "X2_sin_cos" ,Proposal=proposal_X2_sin_cos) LA_deg = GETINT( "LA_deg") LA_cont = GETINT( "LA_continuity",Proposal=(LA_deg-1)) LA_mn_max = GETINTARRAY("LA_mn_max", 2 ,Proposal=proposal_mn_max) LA_sin_cos = GETSTR( "LA_sin_cos" ,Proposal=proposal_LA_sin_cos) IF(fac_nyq.EQ.-1)THEN fac_nyq=2 mn_nyq_min(1)=1+fac_nyq*MAXVAL((/X1_mn_max(1),X2_mn_max(1),LA_mn_max(1)/)) mn_nyq_min(2)=1+fac_nyq*(MAXVAL((/X1_mn_max(2),X2_mn_max(2),LA_mn_max(2)/))+hmap%n_max) mn_nyq = GETINTARRAY("mn_nyq",2) IF(mn_nyq(1).LT.mn_nyq_min(1))THEN SWRITE(UNIT_stdOut,'(A,I6)')'WARNING: mn_nyq(1) too small, should be >= ',mn_nyq_min(1) END IF IF(mn_nyq(2).LT.mn_nyq_min(2))THEN SWRITE(UNIT_stdOut,'(A,I6)') 'WARNING: mn_nyq(2) too small, should be >= ',mn_nyq_min(2) END IF ELSE mn_nyq(1)=1+fac_nyq*MAXVAL((/X1_mn_max(1),X2_mn_max(1),LA_mn_max(1)/)) mn_nyq(2)=1+fac_nyq*(MAXVAL((/X1_mn_max(2),X2_mn_max(2),LA_mn_max(2)/))+hmap%n_max) END IF SWRITE(UNIT_stdOut,*) SWRITE(UNIT_stdOut,'(2(A,I4),A,I6," , ",I6,A)')' fac_nyq = ', fac_nyq,' hmap%n_max = ',hmap%n_max,' ==> interpolation points mn_nyq=( ',mn_nyq(:),' )' SWRITE(UNIT_stdOut,*) grid_type= GETINT("sgrid_grid_type",Proposal=0) degGP = GETINT("degGP",Proposal=MAX(X1X2_deg,LA_deg)+2) !INITIALIZE GRID IF (grid_type.NE.GRID_TYPE_CUSTOM) THEN nElems = GETINT("sgrid_nElems") CALL sgrid%init(nElems,grid_type) ELSE CALL GETREALALLOCARRAY("sgrid_rho", sgrid_rho, n_sgrid_rho) nElems = n_sgrid_rho - 1 CALL sgrid%init(nElems,grid_type,sgrid_rho) SDEALLOCATE(sgrid_rho) END IF !INITIALIZE BASE !sbase parameter !fbase parameter ...exclude_mn_zero CALL base_new(X1_base , X1X2_deg,X1X2_cont,sgrid,degGP , X1_mn_max,mn_nyq,nfp_loc,X1_sin_cos,.FALSE.) CALL base_new(X2_base , X1X2_deg,X1X2_cont,sgrid,degGP , X2_mn_max,mn_nyq,nfp_loc,X2_sin_cos,.FALSE.) CALL base_new(LA_base , LA_deg, LA_cont,sgrid,degGP , LA_mn_max,mn_nyq,nfp_loc,LA_sin_cos,.TRUE. ) CALL hmap_new_auxvar(hmap,X1_base%f%zeta_IP,hmap_auxvar,.FALSE.) !no second derivative needed! IF((which_init.EQ.1).AND.MPIroot) THEN !VMEC IF(lasym)THEN IF((X1_base%f%sin_cos.NE._SINCOS_).OR. & (X2_base%f%sin_cos.NE._SINCOS_).OR. & (LA_base%f%sin_cos.NE._SINCOS_) ) THEN WRITE(UNIT_stdOut,'(A)')'!!!!!!!! WARNING: !!!!!!!!!!!!!!!' WRITE(UNIT_stdOut,'(A)')'!!!!!!!! ----> VMEC was run asymmetric, you should use _sincos_ basis for all variables' WRITE(UNIT_stdOut,'(A)')'!!!!!!!! WARNING: !!!!!!!!!!!!!!!' !CALL abort(__STAMP__,& ! '!!!! VMEC was run asymmetric, you should use _sincos_ basis for all variables') END IF END IF IF((MAXVAL(INT(xm(:))).GT.MINVAL((/X1_mn_max(1),X2_mn_max(1),LA_mn_max(1)/))).OR. & (MAXVAL(ABS(INT(xn(:))/nfp_loc)).GT.MINVAL((/X1_mn_max(2),X2_mn_max(2),LA_mn_max(2)/))))THEN WRITE(UNIT_stdOut,'(A)') '!!!!!!!! WARNING: !!!!!!!!!!!!!!!' WRITE(UNIT_stdOut,'(A,2I6)')'!!!!!!!! ----> you use a lower mode number than the VMEC run ', & MAXVAL(INT(xm(:))),MAXVAL(ABS(INT(xn(:))/nfp_loc)) WRITE(UNIT_stdOut,'(A)') '!!!!!!!! WARNING: !!!!!!!!!!!!!!!' ! CALL abort(__STAMP__,& !'!!!!! you use a lower mode number than the VMEC run (m,n)_max') END IF END IF nDOF_X1 = X1_base%s%nBase* X1_base%f%modes nDOF_X2 = X2_base%s%nBase* X2_base%f%modes nDOF_LA = LA_base%s%nBase* LA_base%f%modes !X1X2_BCtype_axis(MN_ZERO )= GETINT("X1X2_BCtype_axis_mn_zero" ,Proposal=0 ) !AUTOMATIC,m-dependent !X1X2_BCtype_axis(M_ZERO )= GETINT("X1X2_BCtype_axis_m_zero" ,Proposal=0 ) !AUTOMATIC,m-dependent !X1X2_BCtype_axis(M_ODD_FIRST)= GETINT("X1X2_BCtype_axis_m_odd_first",Proposal=0 ) !AUTOMATIC,m-dependent !X1X2_BCtype_axis(M_ODD )= GETINT("X1X2_BCtype_axis_m_odd" ,Proposal=0 ) !AUTOMATIC,m-dependent !X1X2_BCtype_axis(M_EVEN )= GETINT("X1X2_BCtype_axis_m_even" ,Proposal=0 ) !AUTOMATIC,m-dependent X1X2_BCtype_axis= 0 !fix to AUTOMATIC, m-dependent !boundary conditions (used in force, in init slightly changed) ASSOCIATE(modes =>X1_base%f%modes, zero_odd_even=>X1_base%f%zero_odd_even) ALLOCATE(X1_BC_type(1:2,modes)) X1_BC_type(BC_EDGE,:)=BC_TYPE_DIRICHLET DO imode=1,modes X1_BC_type(BC_AXIS,iMode)=X1X2_BCtype_axis(zero_odd_even(iMode)) IF(X1_BC_type(BC_AXIS,iMode).EQ.0)THEN !AUTOMATIC, m-dependent BC, for m>deg, switch off all DOF up to deg+1 X1_BC_type(BC_AXIS,iMode)=-1*MIN(X1_base%s%deg+1,X1_base%f%Xmn(1,iMode)) IF(MPIroot.AND.(nElems.EQ.1).AND.(X1_base%f%Xmn(1,iMode).GT.X1_base%s%deg)) THEN IF(X1_base%f%Xmn(2,iMode).EQ.0) & !warning for all n-modes written once! WRITE(UNIT_stdOut,'(4X,A,I4,A)')'WARNING, 1-element spline with BC for m>deg, will ZERO edge coeff. X1_b(m=',& X1_base%f%Xmn(1,iMode),',n=-n_max,n_max)! (use 2elems instead)' END IF END IF END DO END ASSOCIATE !X1 ASSOCIATE(modes =>X2_base%f%modes, zero_odd_even=>X2_base%f%zero_odd_even) ALLOCATE(X2_BC_type(1:2,modes)) X2_BC_type(BC_EDGE,:)=BC_TYPE_DIRICHLET DO imode=1,modes X2_BC_type(BC_AXIS,iMode)=X1X2_BCtype_axis(zero_odd_even(iMode)) IF(X2_BC_type(BC_AXIS,iMode).EQ.0)THEN ! AUTOMATIC, m-dependent BC, for m>deg, switch off all DOF up to deg+1 X2_BC_type(BC_AXIS,iMode)=-1*MIN(X2_base%s%deg+1,X2_base%f%Xmn(1,iMode)) IF(MPIroot.AND.(nElems.EQ.1).AND.(X2_base%f%Xmn(1,iMode).GT.X2_base%s%deg)) THEN IF(X2_base%f%Xmn(2,iMode).EQ.0) & !warning for all n-modes written once! WRITE(UNIT_stdOut,'(4X,A,I4,A)')'WARNING, 1-element spline with BC for m>deg, will ZERO edge coeff. X2_b(m=',& X2_base%f%Xmn(1,iMode),',n=-n_max,n_max)! (use 2elems instead)' END IF END IF END DO END ASSOCIATE !X2 !LA_BCtype_axis(MN_ZERO )= GETINT("LA_BCtype_axis_mn_zero" ,Proposal=BC_TYPE_SYMMZERO ) !LA_BCtype_axis(M_ZERO )= GETINT("LA_BCtype_axis_m_zero" ,Proposal=BC_TYPE_SYMM ) !LA_BCtype_axis(M_ODD_FIRST)= GETINT("LA_BCtype_axis_m_odd_first",Proposal=0 ) !AUTOMATIC,m-dependent !LA_BCtype_axis(M_ODD )= GETINT("LA_BCtype_axis_m_odd" ,Proposal=0 ) !AUTOMATIC,m-dependent !LA_BCtype_axis(M_EVEN )= GETINT("LA_BCtype_axis_m_even" ,Proposal=0 ) !AUTOMATIC,m-dependent LA_BCtype_axis= 0 !fix to AUTOMATIC, m-dependent ASSOCIATE(modes =>LA_base%f%modes, zero_odd_even=>LA_base%f%zero_odd_even) ALLOCATE(LA_BC_type(1:2,modes)) LA_BC_type(BC_EDGE,:)=BC_TYPE_OPEN DO imode=1,modes LA_BC_type(BC_AXIS,iMode)=LA_BCtype_axis(zero_odd_even(iMode)) IF(LA_BC_type(BC_AXIS,iMode).EQ.0)THEN ! AUTOMATIC, m-dependent BC, for m>deg, switch off all DOF up to deg+1 LA_BC_type(BC_AXIS,iMode)=-1*MIN(LA_base%s%deg+1,LA_base%f%Xmn(1,iMode)) END IF END DO END ASSOCIATE !LA CALL exit_subregion("discretization") CALL enter_subregion("boundary") !INITIALIZATION PARAMETERS (ONLY NECESSARY ON MPIroot) IF(MPIroot)THEN init_average_axis= GETLOGICAL("init_average_axis",Proposal=.FALSE.) IF(init_average_axis)THEN average_axis_move(1) = GETREAL("average_axis_move_X1",Proposal=0.0_wp) average_axis_move(2) = GETREAL("average_axis_move_X2",Proposal=0.0_wp) END IF ALLOCATE(X1_b(1:X1_base%f%modes) ) ALLOCATE(X2_b(1:X2_base%f%modes) ) ALLOCATE(LA_b(1:LA_base%f%modes) ) ALLOCATE(X1_a(1:X1_base%f%modes) ) ALLOCATE(X2_a(1:X2_base%f%modes) ) X1_b=0.0_wp X2_b=0.0_wp LA_b=0.0_wp X1_a=0.0_wp X2_a=0.0_wp IF((init_BC.EQ.0).OR.(init_BC.EQ.2))THEN !READ axis values from input file WRITE(UNIT_stdOut,'(4X,A)')'... read axis data for X1:' ASSOCIATE(modes=>X1_base%f%modes,sin_range=>X1_base%f%sin_range,cos_range=>X1_base%f%cos_range) DO iMode=sin_range(1)+1,sin_range(2) X1_a(iMode)=get_iMode('X1_a_sin',X1_base%f%Xmn(:,iMode),X1_base%f%nfp) END DO !iMode DO iMode=cos_range(1)+1,cos_range(2) X1_a(iMode)=get_iMode('X1_a_cos',X1_base%f%Xmn(:,iMode),X1_base%f%nfp) END DO !iMode END ASSOCIATE WRITE(UNIT_stdOut,'(4X,A)')'... read axis data for X2:' ASSOCIATE(modes=>X2_base%f%modes,sin_range=>X2_base%f%sin_range,cos_range=>X2_base%f%cos_range) DO iMode=sin_range(1)+1,sin_range(2) X2_a(iMode)=get_iMode('X2_a_sin',X2_base%f%Xmn(:,iMode),X2_base%f%nfp) END DO !iMode DO iMode=cos_range(1)+1,cos_range(2) X2_a(iMode)=get_iMode('X2_a_cos',X2_base%f%Xmn(:,iMode),X2_base%f%nfp) END DO !iMode END ASSOCIATE END IF IF(getBoundaryFromFile.EQ.-1)THEN IF(((init_BC.EQ.1).OR.(init_BC.EQ.2)))THEN !READ edge values from input file WRITE(UNIT_stdOut,'(4X,A)')'... read edge boundary data for X1:' ASSOCIATE(modes=>X1_base%f%modes,sin_range=>X1_base%f%sin_range,cos_range=>X1_base%f%cos_range) DO iMode=sin_range(1)+1,sin_range(2) X1_b(iMode)=get_iMode('X1_b_sin',X1_base%f%Xmn(:,iMode),X1_base%f%nfp) END DO !iMode DO iMode=cos_range(1)+1,cos_range(2) X1_b(iMode)=get_iMode('X1_b_cos',X1_base%f%Xmn(:,iMode),X1_base%f%nfp) END DO !iMode END ASSOCIATE WRITE(UNIT_stdOut,'(4X,A)')'... read edge boundary data for X2:' ASSOCIATE(modes=>X2_base%f%modes,sin_range=>X2_base%f%sin_range,cos_range=>X2_base%f%cos_range) DO iMode=sin_range(1)+1,sin_range(2) X2_b(iMode)=get_iMode('X2_b_sin',X2_base%f%Xmn(:,iMode),X2_base%f%nfp) END DO !iMode DO iMode=cos_range(1)+1,cos_range(2) X2_b(iMode)=get_iMode('X2_b_cos',X2_base%f%Xmn(:,iMode),X2_base%f%nfp) END DO !iMode END ASSOCIATE END IF !init_BC ELSE !getBoundaryFromFile CALL BFF%convert_to_modes(X1_base%f,X2_base%f,X1_b,X2_b,scale_minor_radius) END IF END IF !MPIroot boundary_perturb = GETLOGICAL('boundary_perturb', Proposal=.FALSE.) boundary_perturb_type_str = GETSTR("boundary_perturb_type", proposal="legacy") IF (boundary_perturb_type_str .EQ. "legacy") THEN boundary_perturb_type = BLEND_LEGACY ELSE IF (boundary_perturb_type_str .EQ. "cosm") THEN boundary_perturb_type = BLEND_COSM ELSE CALL abort(__STAMP__,& 'boundary_perturb_type must be "legacy" or "cosm", found '//TRIM(boundary_perturb_type_str),& intInfo=boundary_perturb_type,& TypeInfo="InvalidParameterError") END IF boundary_perturb_depth = GETREAL('boundary_perturb_depth', proposal=0.6_wp) IF(boundary_perturb)THEN ALLOCATE(X1pert_b(1:X1_base%f%modes) ) ALLOCATE(X2pert_b(1:X2_base%f%modes) ) X1pert_b=0.0_wp X2pert_b=0.0_wp !READ boudnary values from input file ASSOCIATE(modes=>X1_base%f%modes,sin_range=>X1_base%f%sin_range,cos_range=>X1_base%f%cos_range) SWRITE(UNIT_stdOut,'(4X,A)')'... read data for X1pert:' DO iMode=sin_range(1)+1,sin_range(2) X1pert_b(iMode)=get_iMode('X1pert_b_sin',X1_base%f%Xmn(:,iMode),X1_base%f%nfp) END DO !iMode DO iMode=cos_range(1)+1,cos_range(2) X1pert_b(iMode)=get_iMode('X1pert_b_cos',X1_base%f%Xmn(:,iMode),X1_base%f%nfp) END DO !iMode END ASSOCIATE ASSOCIATE(modes=>X2_base%f%modes,sin_range=>X2_base%f%sin_range,cos_range=>X2_base%f%cos_range) SWRITE(UNIT_stdOut,'(4X,A)')'... read data for X2pert:' DO iMode=sin_range(1)+1,sin_range(2) X2pert_b(iMode)=get_iMode('X2pert_b_sin',X2_base%f%Xmn(:,iMode),X2_base%f%nfp) END DO !iMode DO iMode=cos_range(1)+1,cos_range(2) X2pert_b(iMode)=get_iMode('X2pert_b_cos',X2_base%f%Xmn(:,iMode),X2_base%f%nfp) END DO !iMode END ASSOCIATE END IF CALL exit_subregion("boundary") CALL enter_subregion("initialize minimizer") varsize_for_dofs = (/X1_base%s%nbase,X2_base%s%nbase,LA_base%s%nBase,& X1_base%f%modes,X2_base%f%modes,LA_base%f%modes/) CALL new_minimizer(& sf=sf%minimizer,varsize_in = varsize_for_dofs, & dt_initial=start_dt, MinType_in=MinimizerType, dW_allowed_in=dW_allowed,& ! Minimizer DoCheckDistance=DoCheckDistance, DoCheckAxis=DoCheckAxis,& !what to log outputIter=outputIter, nlogScreen=nlogScreen, logIter=logIter& !when to log ) CALL exit_subregion("initialize minimizer") CALL InitializeMHD3D_EvalFunc() CALL exit_subregion("init-MHD3D") CALL par_barrier(afterScreenOut='...DONE') SWRITE(UNIT_stdOut,fmt_sep) END SUBROUTINE InitMHD3D