Initialize LAMBDA FROM U_init%X1,%X2 and iota profile, this computation is distributed over MPIranks
! CALL par_reduce(LA_gIP,'SUM',0) ! IF(MPIroot)THEN ! DO iMode=1,modes ! IF(zero_odd_even(iMode).EQ.0)THEN ! U_init%LA(:,iMode)=0.0_wp ! (0,0) mode should not be here, but must be zero if its used. ! ELSE ! U_init%LA(:,iMode)=LA_base%s%initDOF( LA_gIP(:,iMode) ) ! END IF!iMode ~ 0 ! BC_val =(/ 0.0_wp, 0.0_wp/) ! CALL LA_base%s%applyBCtoDOF(U_init%LA(:,iMode),LA_BC_type(:,iMode),BC_val) ! END DO !iMode=1,modes ! END IF ! CALL par_BCast(U_init%LA,0)
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| class(t_sol_var_MHD3D), | intent(inout) | :: | U_init |
SUBROUTINE Init_LA_from_Solution(U_init) ! MODULES USE MODgvec_Globals, ONLY:ProgressBar,getTime,myRank,nRanks USE MODgvec_MHD3D_Vars , ONLY:X1_base,X2_base,LA_base,LA_BC_Type,hmap, Phi_profile, chi_profile USE MODgvec_sol_var_MHD3D, ONLY:t_sol_var_mhd3d USE MODgvec_lambda_solve, ONLY:lambda_solve USE MODgvec_MPI ,ONLY:par_reduce,par_BCast USE MODgvec_hmap ,ONLY:hmap_new_auxvar,PP_T_HMAP_AUXVAR !$ USE omp_lib IMPLICIT NONE !----------------------------------------------------------------------------------------------------------------------------------- ! INPUT VARIABLES !----------------------------------------------------------------------------------------------------------------------------------- ! OUTPUT VARIABLES CLASS(t_sol_var_MHD3D), INTENT(INOUT) :: U_init !----------------------------------------------------------------------------------------------------------------------------------- ! LOCAL VARIABLES INTEGER :: iMode,is,ns_str,ns_end,iRank,nBase REAL(wp) :: BC_val(2),rhopos REAL(wp) :: StartTime,EndTime REAL(wp),DIMENSION(1:LA_base%s%nBase):: PhiPrime,chiPrime REAL(wp) :: LA_gIP(1:LA_base%s%nBase,1:LA_base%f%modes) #ifdef PP_WHICH_HMAP TYPE(PP_T_HMAP_AUXVAR),ALLOCATABLE :: hmap_xv(:) !! auxiliary variables for hmap #else CLASS(PP_T_HMAP_AUXVAR),ALLOCATABLE :: hmap_xv(:) !! auxiliary variables for hmap #endif !=================================================================================================================================== StartTime=GetTime() SWRITE(UNIT_stdOut,'(4X,A)') "... Initialize lambda from mapping ..." CALL enter_subregion("reinit-lambda") nBase = LA_base%s%nBase ASSOCIATE(modes => LA_base%f%modes, & s_IP => LA_base%s%s_IP, & zero_odd_even=> LA_base%f%zero_odd_even, & modes_str => LA_base%f%modes_str, & modes_end => LA_base%f%modes_end, & offset_modes => LA_Base%f%offset_modes ) !evaluate profiles only in MPIroot! IF(MPIroot)THEN DO is=1,nBase rhopos=MIN(1.0_wp-1.0e-12_wp,MAX(1.0e-4_wp,s_IP(is))) !exclude axis phiPrime(is)=Phi_profile%eval_at_rho(rhopos,deriv=1) chiPrime(is)=chi_profile%eval_at_rho(rhopos,deriv=1) END DO END IF !MPIroot CALL par_BCast(phiPrime,0) CALL par_BCast(chiPrime,0) !initialize Lambda, radially parallel ns_str = (nBase*(myRank ))/nRanks+1 ns_end = (nBase*(myRank+1))/nRanks LA_gIP=0.0_wp CALL ProgressBar(0,ns_end) !init CALL hmap_new_auxvar(hmap,X1_base%f%x_IP(2,:),hmap_xv,.FALSE.) !no 2nd derivative needed DO is=ns_str,ns_end rhopos=MIN(1.0_wp-1.0e-12_wp,MAX(1.0e-4_wp,s_IP(is))) !exclude axis CALL lambda_Solve(rhopos,hmap,hmap_xv,X1_base,X2_base,LA_base%f,U_init%X1,U_init%X2,LA_gIP(is,:),phiPrime(is),chiPrime(is)) CALL ProgressBar(is,ns_end) END DO !is DEALLOCATE(hmap_xv) !!! CALL par_reduce(LA_gIP,'SUM',0) !!! IF(MPIroot)THEN !!! DO iMode=1,modes !!! IF(zero_odd_even(iMode).EQ.MN_ZERO)THEN !!! U_init%LA(:,iMode)=0.0_wp ! (0,0) mode should not be here, but must be zero if its used. !!! ELSE !!! U_init%LA(:,iMode)=LA_base%s%initDOF( LA_gIP(:,iMode) ) !!! END IF!iMode ~ MN_ZERO !!! BC_val =(/ 0.0_wp, 0.0_wp/) !!! CALL LA_base%s%applyBCtoDOF(U_init%LA(:,iMode),LA_BC_type(:,iMode),BC_val) !!! END DO !iMode=1,modes !!! END IF !!! CALL par_BCast(U_init%LA,0) !reduce radially, different mode sets to different MPIranks (should be a gatherv) DO iRank=0,nRanks-1 IF(offset_modes(iRank+1)-offset_modes(iRank).GT.0) & CALL par_Reduce(LA_gIP(1:nbase,offset_modes(iRank)+1:offset_modes(iRank+1)),'SUM',iRank) END DO DO iMode=modes_str,modes_end IF(zero_odd_even(iMode).EQ.MN_ZERO)THEN U_init%LA(1:nBase,iMode)=0.0_wp ! (0,0) mode should not be here, but must be zero if its used. ELSE U_init%LA(1:nBase,iMode)=LA_base%s%initDOF( LA_gIP(1:nBase,iMode) ) END IF!iMode ~ MN_ZERO BC_val =(/ 0.0_wp, 0.0_wp/) CALL LA_base%s%applyBCtoDOF(U_init%LA(:,iMode),LA_BC_type(:,iMode),BC_val) END DO !iMode=modes_str, modes_end ! broadcast result: different mode ranges to different MPIranks DO iRank=0,nRanks-1 IF(offset_modes(iRank+1)-offset_modes(iRank).GT.0) & CALL par_Bcast(U_init%LA(1:nBase,offset_modes(iRank)+1:offset_modes(iRank+1)),iRank) END DO END ASSOCIATE !LA EndTime=GetTime() CALL exit_subregion("reinit-lambda") SWRITE(UNIT_stdOut,'(4X,A,F9.2,A)') " init lambda took [ ",EndTime-StartTime," sec]" END SUBROUTINE Init_LA_from_solution