549 &eq_2_out,X_1_out,X_2_out,eq_1,grid_name)
result(ierr)
553 character(*),
parameter :: rout_name =
'interp_HEL_on_grid'
558 type(
eq_2_type),
intent(inout),
optional :: eq_2
559 type(
x_1_type),
intent(inout),
optional :: x_1
560 type(
x_2_type),
intent(inout),
optional :: x_2
561 type(
eq_2_type),
intent(inout),
optional :: eq_2_out
562 type(
x_1_type),
intent(inout),
optional :: x_1_out
563 type(
x_2_type),
intent(inout),
optional :: x_2_out
564 type(
eq_1_type),
intent(in),
optional :: eq_1
565 character(len=*),
intent(in),
optional :: grid_name
568 real(
dp),
allocatable :: theta_i(:,:,:)
569 integer,
allocatable :: fund_theta_int_displ(:,:,:)
571 character(len=max_str_ln) :: err_msg
577 if (
present(grid_name))
then
578 call writo(
'Adapt quantities to '//trim(grid_name))
583 if (
present(eq_2).and..not.
present(eq_1))
then
585 err_msg =
'To interpolate metric equilibrium variables, flux &
586 &equilibrium has to be provided as well through eq_1'
589 if (
present(eq_2) .and. (
present(x_1).or.
present(x_2)))
then
591 err_msg =
'Only the quantities on one type of grid can be &
592 &interpolated in a single call'
604 ierr = get_ang_interp_data_hel(grid_in,grid_out,theta_i,&
605 &fund_theta_int_displ,tb_sym=tb_sym,use_e=.false.)
609 if (
present(eq_2))
then
610 if (
present(eq_2_out))
then
611 ierr = interp_var_6d_real(eq_2%jac_FD,eq_2_out%jac_FD)
613 ierr = interp_var_7d_real(eq_2%g_FD,eq_2_out%g_FD,sym_type=3)
615 ierr = interp_var_7d_real(eq_2%h_FD,eq_2_out%h_FD,sym_type=4)
617 ierr = interp_var_3d_real(eq_2%S,eq_2_out%S)
619 ierr = interp_var_3d_real(eq_2%sigma,eq_2_out%sigma)
621 ierr = interp_var_3d_real(eq_2%kappa_n,eq_2_out%kappa_n)
623 ierr = interp_var_3d_real(eq_2%kappa_g,eq_2_out%kappa_g,&
627 ierr = interp_var_6d_real_ow(eq_2%jac_FD)
629 ierr = interp_var_7d_real_ow(eq_2%g_FD,sym_type=3)
631 ierr = interp_var_7d_real_ow(eq_2%h_FD,sym_type=4)
633 ierr = interp_var_3d_real_ow(eq_2%S)
635 ierr = interp_var_3d_real_ow(eq_2%sigma)
637 ierr = interp_var_3d_real_ow(eq_2%kappa_n)
639 ierr = interp_var_3d_real_ow(eq_2%kappa_g,sym_type=2)
645 if (
present(x_1))
then
646 if (
present(x_1_out))
then
647 ierr = interp_var_4d_complex(x_1%U_0,x_1_out%U_0,sym_type=2)
649 ierr = interp_var_4d_complex(x_1%U_1,x_1_out%U_1,sym_type=2)
651 ierr = interp_var_4d_complex(x_1%DU_0,x_1_out%DU_0,sym_type=1)
653 ierr = interp_var_4d_complex(x_1%DU_1,x_1_out%DU_1,sym_type=1)
656 ierr = interp_var_4d_complex_ow(x_1%U_0,sym_type=2)
658 ierr = interp_var_4d_complex_ow(x_1%U_1,sym_type=2)
660 ierr = interp_var_4d_complex_ow(x_1%DU_0,sym_type=1)
662 ierr = interp_var_4d_complex_ow(x_1%DU_1,sym_type=1)
668 if (
present(x_2))
then
669 if (
present(x_2_out))
then
670 ierr = interp_var_4d_complex(x_2%PV_0,x_2_out%PV_0,sym_type=1)
672 ierr = interp_var_4d_complex(x_2%PV_1,x_2_out%PV_1,sym_type=1)
674 ierr = interp_var_4d_complex(x_2%PV_2,x_2_out%PV_2,sym_type=1)
676 ierr = interp_var_4d_complex(x_2%KV_0,x_2_out%KV_0,sym_type=1)
678 ierr = interp_var_4d_complex(x_2%KV_1,x_2_out%KV_1,sym_type=1)
680 ierr = interp_var_4d_complex(x_2%KV_2,x_2_out%KV_2,sym_type=1)
683 ierr = interp_var_4d_complex_ow(x_2%PV_0,sym_type=1)
685 ierr = interp_var_4d_complex_ow(x_2%PV_1,sym_type=1)
687 ierr = interp_var_4d_complex_ow(x_2%PV_2,sym_type=1)
689 ierr = interp_var_4d_complex_ow(x_2%KV_0,sym_type=1)
691 ierr = interp_var_4d_complex_ow(x_2%KV_1,sym_type=1)
693 ierr = interp_var_4d_complex_ow(x_2%KV_2,sym_type=1)
699 if (
present(grid_name))
then
732 integer function interp_var_3d_real(var,var_int,sym_type)
result(ierr)
734 real(
dp),
intent(in) :: var(1:,1:,1:)
735 real(
dp),
intent(inout) :: var_int(1:,1:,1:)
736 integer,
intent(in),
optional :: sym_type
739 integer :: i_lo, i_hi
740 integer :: id, jd, kd
741 integer :: sym_type_loc
748 if (
present(sym_type)) sym_type_loc = sym_type
751 if (sym_type_loc.lt.0 .or. sym_type_loc.gt.2)
then
753 err_msg =
'Nonsensible symmetry type '//&
754 &trim(
i2str(sym_type_loc))
759 do kd = 1,
size(var_int,3)
761 do jd = 1,
size(var_int,2)
763 do id = 1,
size(var_int,1)
765 i_lo = floor(abs(theta_i(id,jd,kd)))
766 i_hi = ceiling(abs(theta_i(id,jd,kd)))
768 var_int(id,jd,kd) = var(i_lo,1,kd) + &
769 &(var(i_hi,1,kd)-var(i_lo,1,kd))*&
770 &(abs(theta_i(id,jd,kd))-i_lo)
771 if (theta_i(id,jd,kd).lt.0)
then
772 if (sym_type_loc.eq.2) var_int(id,jd,kd) = &
778 end function interp_var_3d_real
780 integer function interp_var_3d_real_ow(var,sym_type)
result(ierr)
782 real(
dp),
intent(inout),
allocatable :: var(:,:,:)
783 integer,
intent(in),
optional :: sym_type
786 real(
dp),
allocatable :: var_3d_loc(:,:,:)
787 integer :: var_dim(3,2)
793 var_dim(:,1) = [1,1,1]
794 var_dim(:,2) = [shape(theta_i)]
797 allocate(var_3d_loc(var_dim(1,1):var_dim(1,2),&
798 &var_dim(2,1):var_dim(2,2),var_dim(3,1):var_dim(3,2)))
801 ierr = interp_var_3d_real(var,var_3d_loc,sym_type)
806 allocate(var(var_dim(1,1):var_dim(1,2),&
807 &var_dim(2,1):var_dim(2,2),var_dim(3,1):var_dim(3,2)))
811 end function interp_var_3d_real_ow
813 integer function interp_var_4d_complex(var,var_int,sym_type) &
817 complex(dp),
intent(in) :: var(1:,1:,1:,1:)
818 complex(dp),
intent(inout) :: var_int(1:,1:,1:,1:)
819 integer,
intent(in),
optional :: sym_type
822 integer :: i_lo, i_hi
823 integer :: id, jd, kd
824 integer :: sym_type_loc
831 if (
present(sym_type)) sym_type_loc = sym_type
834 if (sym_type_loc.lt.0 .or. sym_type_loc.gt.2)
then
836 err_msg =
'Nonsensible symmetry type '//&
837 &trim(
i2str(sym_type_loc))
842 do kd = 1,
size(var_int,3)
844 do jd = 1,
size(var_int,2)
846 do id = 1,
size(var_int,1)
848 i_lo = floor(abs(theta_i(id,jd,kd)))
849 i_hi = ceiling(abs(theta_i(id,jd,kd)))
851 var_int(id,jd,kd,:) = var(i_lo,1,kd,:) + &
852 &(var(i_hi,1,kd,:)-var(i_lo,1,kd,:))*&
853 &(abs(theta_i(id,jd,kd))-i_lo)
854 if (theta_i(id,jd,kd).lt.0)
then
855 if (sym_type_loc.eq.1) var_int(id,jd,kd,:) = &
856 &conjg(var_int(id,jd,kd,:))
857 if (sym_type_loc.eq.2) var_int(id,jd,kd,:) = &
858 &- conjg(var_int(id,jd,kd,:))
863 end function interp_var_4d_complex
865 integer function interp_var_4d_complex_ow(var,sym_type)
result(ierr)
867 complex(dp),
intent(inout),
allocatable :: var(:,:,:,:)
868 integer,
intent(in),
optional :: sym_type
871 complex(dp),
allocatable :: var_4d_loc(:,:,:,:)
872 integer :: var_dim(4,2)
878 var_dim(:,1) = [1,1,1,1]
879 var_dim(:,2) = [shape(theta_i),
size(var,4)]
882 allocate(var_4d_loc(var_dim(1,1):var_dim(1,2),&
883 &var_dim(2,1):var_dim(2,2),var_dim(3,1):var_dim(3,2),&
884 &var_dim(4,1):var_dim(4,2)))
887 ierr = interp_var_4d_complex(var,var_4d_loc,sym_type)
892 allocate(var(var_dim(1,1):var_dim(1,2),&
893 &var_dim(2,1):var_dim(2,2),var_dim(3,1):var_dim(3,2),&
894 &var_dim(4,1):var_dim(4,2)))
898 end function interp_var_4d_complex_ow
900 integer function interp_var_6d_real(var,var_int,sym_type)
result(ierr)
902 real(
dp),
intent(in) :: var(1:,1:,1:,0:,0:,0:)
903 real(
dp),
intent(inout) :: var_int(1:,1:,1:,0:,0:,0:)
904 integer,
intent(in),
optional :: sym_type
907 integer :: i_lo, i_hi
908 integer :: id, jd, kd, ld
909 integer :: sym_type_loc
916 if (
present(sym_type)) sym_type_loc = sym_type
919 if (sym_type_loc.lt.0 .or. sym_type_loc.gt.2)
then
921 err_msg =
'Nonsensible symmetry type '//&
922 &trim(
i2str(sym_type_loc))
927 do kd = 1,
size(var_int,3)
929 do jd = 1,
size(var_int,2)
931 do id = 1,
size(var_int,1)
933 i_lo = floor(abs(theta_i(id,jd,kd)))
934 i_hi = ceiling(abs(theta_i(id,jd,kd)))
936 var_int(id,jd,kd,:,:,:) = var(i_lo,1,kd,:,:,:) + &
937 &(var(i_hi,1,kd,:,:,:)-var(i_lo,1,kd,:,:,:))*&
938 &(abs(theta_i(id,jd,kd))-i_lo)
939 if (theta_i(id,jd,kd).lt.0)
then
940 if (sym_type_loc.eq.2) var_int(id,jd,kd,:,:,:) = &
941 &- var_int(id,jd,kd,:,:,:)
944 do ld = 0,
size(var_int,6)-1
945 var_int(id,jd,kd,:,:,ld) = &
946 &(-1)**ld*var_int(id,jd,kd,:,:,ld)
950 err_msg =
'!!! INTERP_VAR_6D_REAL NOT YET &
951 &IMPLEMENTED FOR TOROIDAL FLUX !!!'
958 end function interp_var_6d_real
960 integer function interp_var_6d_real_ow(var,sym_type)
result(ierr)
962 real(
dp),
intent(inout),
allocatable :: var(:,:,:,:,:,:)
963 integer,
intent(in),
optional :: sym_type
966 real(
dp),
allocatable :: var_6d_loc(:,:,:,:,:,:)
967 integer :: var_dim(6,2)
973 var_dim(:,1) = [1,1,1,0,0,0]
974 var_dim(:,2) = [shape(theta_i),
size(var,4)-1,
size(var,5)-1,&
978 allocate(var_6d_loc(var_dim(1,1):var_dim(1,2),&
979 &var_dim(2,1):var_dim(2,2),var_dim(3,1):var_dim(3,2),&
980 &var_dim(4,1):var_dim(4,2),var_dim(5,1):var_dim(5,2),&
981 &var_dim(6,1):var_dim(6,2)))
984 ierr = interp_var_6d_real(var,var_6d_loc,sym_type)
989 allocate(var(var_dim(1,1):var_dim(1,2),&
990 &var_dim(2,1):var_dim(2,2),var_dim(3,1):var_dim(3,2),&
991 &var_dim(4,1):var_dim(4,2),var_dim(5,1):var_dim(5,2),&
992 &var_dim(6,1):var_dim(6,2)))
996 end function interp_var_6d_real_ow
998 integer function interp_var_7d_real(var,var_int,sym_type)
result(ierr)
1003 real(
dp),
intent(in) :: var(1:,1:,1:,1:,0:,0:,0:)
1004 real(
dp),
intent(inout) :: var_int(1:,1:,1:,1:,0:,0:,0:)
1005 integer,
intent(in),
optional :: sym_type
1008 integer :: i_lo, i_hi
1009 integer :: id, jd, kd, ld
1010 integer :: sym_type_loc
1011 real(
dp),
allocatable :: t_met(:,:,:,:,:,:)
1012 integer,
allocatable :: derivs_loc(:,:)
1020 if (
present(sym_type)) sym_type_loc = sym_type
1023 if (sym_type_loc.lt.0 .or. sym_type_loc.gt.4)
then
1025 err_msg =
'Nonsensible symmetry type '//&
1026 &trim(
i2str(sym_type_loc))
1031 do kd = 1,
size(var_int,3)
1032 do jd = 1,
size(var_int,2)
1033 do id = 1,
size(var_int,1)
1034 i_lo = floor(abs(theta_i(id,jd,kd)))
1035 i_hi = ceiling(abs(theta_i(id,jd,kd)))
1037 var_int(id,jd,kd,:,:,:,:) = var(i_lo,1,kd,:,:,:,:) + &
1038 &(var(i_hi,1,kd,:,:,:,:)-var(i_lo,1,kd,:,:,:,:))*&
1039 &(abs(theta_i(id,jd,kd))-i_lo)
1045 if (sym_type_loc.eq.2 .or. sym_type_loc.eq.3 .or. &
1046 &sym_type_loc.eq.4)
then
1047 do kd = 1,
size(var_int,3)
1048 do jd = 1,
size(var_int,2)
1049 do id = 1,
size(var_int,1)
1050 if (theta_i(id,jd,kd).lt.0)
then
1052 if (sym_type_loc.eq.2)
then
1053 var_int(id,jd,kd,:,:,:,:) = &
1054 &- var_int(id,jd,kd,:,:,:,:)
1055 else if (sym_type_loc.eq.3 .or. &
1056 &sym_type_loc.eq.4)
then
1057 c_loc(1) =
c([2,1],.true.)
1058 c_loc(2) =
c([3,2],.true.)
1059 var_int(id,jd,kd,c_loc(1),:,:,:) = &
1060 &- var_int(id,jd,kd,c_loc(1),:,:,:)
1061 var_int(id,jd,kd,c_loc(2),:,:,:) = &
1062 &- var_int(id,jd,kd,c_loc(2),:,:,:)
1066 do ld = 0,
size(var_int,7)-1
1067 var_int(id,jd,kd,:,:,:,ld) = (-1)**ld*&
1068 &var_int(id,jd,kd,:,:,:,ld)
1072 err_msg =
'!!! INTERP_VAR_7D_REAL NOT YET &
1073 &IMPLEMENTED FOR TOROIDAL FLUX !!!'
1083 if (sym_type_loc.eq.3 .or. sym_type_loc.eq.4)
then
1084 allocate(t_met(
size(var_int,1),
size(var_int,2),&
1085 &
size(var_int,3),0:
size(var_int,5)-1,&
1086 &0:
size(var_int,6)-1,0:
size(var_int,7)-1))
1090 do kd = 1,
size(theta_i,3)
1091 t_met(:,:,kd,0,ld,0) = &
1092 &2*
pi*eq_1%q_saf_FD(kd,ld+1)
1097 do kd = 1,
size(theta_i,3)
1098 t_met(:,:,kd,0,ld,0) = &
1099 &-2*
pi*eq_1%rot_t_FD(kd,ld+1)
1103 do kd = 1,
size(theta_i,3)
1104 do jd = 1,
size(theta_i,2)
1105 do id = 1,
size(theta_i,1)
1106 t_met(id,jd,kd,:,:,:) = t_met(id,jd,kd,:,:,:)*&
1107 &fund_theta_int_displ(id,jd,kd)
1114 if (sym_type_loc.eq.3)
then
1118 do jd = 1,
size(derivs_loc,2)
1120 c_loc(1) =
c([3,2],.true.)
1121 c_loc(2) =
c([2,2],.true.)
1123 &var_int(:,:,:,c_loc(1),:,:,:),t_met,&
1124 &var_int(:,:,:,c_loc(2),&
1125 &derivs_loc(1,jd),derivs_loc(2,jd),&
1126 &derivs_loc(3,jd)),derivs_loc(:,jd))
1129 c_loc(1) =
c([3,1],.true.)
1130 c_loc(2) =
c([3,2],.true.)
1132 &var_int(:,:,:,c_loc(1),:,:,:),t_met,&
1133 &var_int(:,:,:,c_loc(2),&
1134 &derivs_loc(1,jd),derivs_loc(2,jd),&
1135 &derivs_loc(3,jd)),derivs_loc(:,jd))
1138 c_loc(1) =
c([3,2],.true.)
1139 c_loc(2) =
c([2,2],.true.)
1141 &var_int(:,:,:,c_loc(1),:,:,:),t_met,&
1142 &var_int(:,:,:,c_loc(2),&
1143 &derivs_loc(1,jd),derivs_loc(2,jd),&
1144 &derivs_loc(3,jd)),derivs_loc(:,jd))
1147 c_loc(1) =
c([1,1],.true.)
1148 c_loc(2) =
c([1,2],.true.)
1150 &var_int(:,:,:,c_loc(1),:,:,:),t_met,&
1151 &var_int(:,:,:,c_loc(2),&
1152 &derivs_loc(1,jd),derivs_loc(2,jd),&
1153 &derivs_loc(3,jd)),derivs_loc(:,jd))
1159 err_msg =
'!!! INTERP_VAR_7D_REAL NOT YET &
1160 &IMPLEMENTED FOR TOROIDAL FLUX !!!'
1166 if (sym_type_loc.eq.4)
then
1170 do jd = 1,
size(derivs_loc,2)
1172 c_loc(1) =
c([1,2],.true.)
1173 c_loc(2) =
c([1,1],.true.)
1175 &var_int(:,:,:,c_loc(1),:,:,:),-t_met,&
1176 &var_int(:,:,:,c_loc(2),&
1177 &derivs_loc(1,jd),derivs_loc(2,jd),&
1178 &derivs_loc(3,jd)),derivs_loc(:,jd))
1181 c_loc(1) =
c([2,2],.true.)
1182 c_loc(2) =
c([1,2],.true.)
1184 &var_int(:,:,:,c_loc(1),:,:,:),-t_met,&
1185 &var_int(:,:,:,c_loc(2),&
1186 &derivs_loc(1,jd),derivs_loc(2,jd),&
1187 &derivs_loc(3,jd)),derivs_loc(:,jd))
1190 c_loc(1) =
c([1,2],.true.)
1191 c_loc(2) =
c([1,1],.true.)
1193 &var_int(:,:,:,c_loc(1),:,:,:),-t_met,&
1194 &var_int(:,:,:,c_loc(2),&
1195 &derivs_loc(1,jd),derivs_loc(2,jd),&
1196 &derivs_loc(3,jd)),derivs_loc(:,jd))
1199 c_loc(1) =
c([2,3],.true.)
1200 c_loc(2) =
c([1,3],.true.)
1202 &var_int(:,:,:,c_loc(1),:,:,:),-t_met,&
1203 &var_int(:,:,:,c_loc(2),&
1204 &derivs_loc(1,jd),derivs_loc(2,jd),&
1205 &derivs_loc(3,jd)),derivs_loc(:,jd))
1211 err_msg =
'!!! INTERP_VAR_7D_REAL NOT YET &
1212 &IMPLEMENTED FOR TOROIDAL FLUX !!!'
1216 end function interp_var_7d_real
1218 integer function interp_var_7d_real_ow(var,sym_type)
result(ierr)
1221 real(dp),
intent(inout),
allocatable :: var(:,:,:,:,:,:,:)
1222 integer,
intent(in),
optional :: sym_type
1225 real(dp),
allocatable :: var_7d_loc(:,:,:,:,:,:,:)
1226 integer :: var_dim(7,2)
1232 var_dim(:,1) = [1,1,1,1,0,0,0]
1233 var_dim(:,2) = [shape(theta_i),
size(var,4),
size(var,5)-1,&
1234 &
size(var,6)-1,
size(var,7)-1]
1237 allocate(var_7d_loc(var_dim(1,1):var_dim(1,2),&
1238 &var_dim(2,1):var_dim(2,2),var_dim(3,1):var_dim(3,2),&
1239 &var_dim(4,1):var_dim(4,2),var_dim(5,1):var_dim(5,2),&
1240 &var_dim(6,1):var_dim(6,2),var_dim(7,1):var_dim(7,2)))
1243 ierr = interp_var_7d_real(var,var_7d_loc,sym_type)
1248 allocate(var(var_dim(1,1):var_dim(1,2),&
1249 &var_dim(2,1):var_dim(2,2),var_dim(3,1):var_dim(3,2),&
1250 &var_dim(4,1):var_dim(4,2),var_dim(5,1):var_dim(5,2),&
1251 &var_dim(6,1):var_dim(6,2),var_dim(7,1):var_dim(7,2)))
1255 end function interp_var_7d_real_ow