1 # 1 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
2 # 1 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/../generics.fypp" 1
11 # 57 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/../generics.fypp"
12 # 2 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp" 2
13 # 1 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/../instrumentation.fypp" 1
14 # 1 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/../subr_list.fypp" 1
23 # 926 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/../subr_list.fypp"
24 # 2 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/../instrumentation.fypp" 2
33 # 112 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/../instrumentation.fypp"
34 # 3 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp" 2
44 use atlas_module,
only: atlas_field,atlas_integer,atlas_real,atlas_functionspace,atlas_functionspace_nodecolumns, &
45 & atlas_functionspace_pointcloud,atlas_functionspace_structuredcolumns
56 # 25 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
57 # 26 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
59 # 26 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
61 # 26 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
63 # 28 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
64 # 25 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
65 # 26 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
67 # 26 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
69 # 26 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
71 # 28 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
72 # 29 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
75 # 32 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
76 # 33 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
78 # 33 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
80 # 33 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
82 # 35 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
83 # 32 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
84 # 33 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
86 # 33 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
88 # 33 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
90 # 35 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
91 # 36 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
105 # 50 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
106 # 51 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
116 type(atlas_field),
intent(in) :: afield
118 integer(kind_int),
intent(out) :: array(:,:)
119 character(len=*),
intent(in),
optional :: lev2d
122 integer :: nmga,nnodes,nl0,nl2d,il0
124 integer(kind_int),
pointer :: ptr_1(:),ptr_2(:,:)
125 character(len=1024) :: llev2d
135 if (
present(lev2d)) llev2d = lev2d
136 if (.not.((trim(llev2d)==
'first').or.(trim(llev2d)==
'last')))
call mpl%abort(
'atlas_field_to_array_int_r2',
'wrong lev2d')
139 if (afield%kind()/=atlas_integer(
kind_int))
call mpl%abort(
'atlas_field_to_array_int_r2',
'wrong kind for field '//afield%name())
149 nnodes = product(shp(1:2-1))
152 if (nmga/=nnodes)
call mpl%abort(
'atlas_field_to_array_int_r2',
'wrong number of nodes for field '//afield%name())
162 if (afield%levels()==0)
then
163 if (trim(llev2d)==
'first')
then
165 elseif (trim(llev2d)==
'last')
then
168 call afield%data(ptr_1)
169 array(:,nl2d) = ptr_1
172 if (nl0>afield%levels())
call mpl%abort(
'atlas_field_to_array_int_r2',
'not enough levels in ATLAS field')
173 call afield%data(ptr_2)
175 array(:,il0) = ptr_2(il0,:)
184 # 51 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
194 type(atlas_field),
intent(in) :: afield
196 real(kind_real),
intent(out) :: array(:,:)
197 character(len=*),
intent(in),
optional :: lev2d
200 integer :: nmga,nnodes,nl0,nl2d,il0
202 real(kind_real),
pointer :: ptr_1(:),ptr_2(:,:)
203 character(len=1024) :: llev2d
213 if (
present(lev2d)) llev2d = lev2d
214 if (.not.((trim(llev2d)==
'first').or.(trim(llev2d)==
'last')))
call mpl%abort(
'atlas_field_to_array_real_r2',
'wrong lev2d')
217 if (afield%kind()/=atlas_real(kind_real))
call mpl%abort(
'atlas_field_to_array_real_r2',
'wrong kind for field '//afield%name())
227 nnodes = product(shp(1:2-1))
230 if (nmga/=nnodes)
call mpl%abort(
'atlas_field_to_array_real_r2',
'wrong number of nodes for field '//afield%name())
233 array = 0.0_kind_real
240 if (afield%levels()==0)
then
241 if (trim(llev2d)==
'first')
then
243 elseif (trim(llev2d)==
'last')
then
246 call afield%data(ptr_1)
247 array(:,nl2d) = ptr_1
250 if (nl0>afield%levels())
call mpl%abort(
'atlas_field_to_array_real_r2',
'not enough levels in ATLAS field')
251 call afield%data(ptr_2)
253 array(:,il0) = ptr_2(il0,:)
262 # 129 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
263 # 50 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
264 # 51 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
274 type(atlas_field),
intent(in) :: afield
276 integer(kind_int),
intent(out) :: array(:,:,:)
277 character(len=*),
intent(in),
optional :: lev2d
280 integer :: nmga,nnodes,nl0,nl2d,il0
282 integer(kind_int),
pointer :: ptr_1(:),ptr_2(:,:)
283 character(len=1024) :: llev2d
293 if (
present(lev2d)) llev2d = lev2d
294 if (.not.((trim(llev2d)==
'first').or.(trim(llev2d)==
'last')))
call mpl%abort(
'atlas_field_to_array_int_r3',
'wrong lev2d')
297 if (afield%kind()/=atlas_integer(
kind_int))
call mpl%abort(
'atlas_field_to_array_int_r3',
'wrong kind for field '//afield%name())
307 nnodes = product(shp(1:3-1))
310 if (nmga/=nnodes)
call mpl%abort(
'atlas_field_to_array_int_r3',
'wrong number of nodes for field '//afield%name())
320 if (afield%levels()==0)
then
321 if (trim(llev2d)==
'first')
then
323 elseif (trim(llev2d)==
'last')
then
326 call afield%data(ptr_1)
328 array(:,:,nl2d) = reshape(ptr_1,shp(1:2))
330 if (nl0>afield%levels())
call mpl%abort(
'atlas_field_to_array_int_r3',
'not enough levels in ATLAS field')
331 call afield%data(ptr_2)
334 array(:,:,il0) = reshape(ptr_2(il0,:),shp(1:2))
342 # 51 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
352 type(atlas_field),
intent(in) :: afield
354 real(kind_real),
intent(out) :: array(:,:,:)
355 character(len=*),
intent(in),
optional :: lev2d
358 integer :: nmga,nnodes,nl0,nl2d,il0
360 real(kind_real),
pointer :: ptr_1(:),ptr_2(:,:)
361 character(len=1024) :: llev2d
371 if (
present(lev2d)) llev2d = lev2d
372 if (.not.((trim(llev2d)==
'first').or.(trim(llev2d)==
'last')))
call mpl%abort(
'atlas_field_to_array_real_r3',
'wrong lev2d')
375 if (afield%kind()/=atlas_real(kind_real))
call mpl%abort(
'atlas_field_to_array_real_r3',
'wrong kind for field '//afield%name())
385 nnodes = product(shp(1:3-1))
388 if (nmga/=nnodes)
call mpl%abort(
'atlas_field_to_array_real_r3',
'wrong number of nodes for field '//afield%name())
391 array = 0.0_kind_real
398 if (afield%levels()==0)
then
399 if (trim(llev2d)==
'first')
then
401 elseif (trim(llev2d)==
'last')
then
404 call afield%data(ptr_1)
406 array(:,:,nl2d) = reshape(ptr_1,shp(1:2))
408 if (nl0>afield%levels())
call mpl%abort(
'atlas_field_to_array_real_r3',
'not enough levels in ATLAS field')
409 call afield%data(ptr_2)
412 array(:,:,il0) = reshape(ptr_2(il0,:),shp(1:2))
420 # 129 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
421 # 130 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
423 # 132 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
433 type(atlas_field),
intent(in) :: afield
435 logical,
intent(out) :: array(:,:)
436 character(len=*),
intent(in),
optional :: lev2d
440 integer,
allocatable :: array_int(:,:)
441 character(len=1024) :: llev2d
451 if (
present(lev2d)) llev2d = lev2d
452 if (.not.((trim(llev2d)==
'first').or.(trim(llev2d)==
'last')))
call mpl%abort(
'atlas_field_to_array_logical_r2',
'wrong lev2d')
456 allocate(array_int(shp(1),shp(2)))
466 deallocate(array_int)
472 # 132 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
482 type(atlas_field),
intent(in) :: afield
484 logical,
intent(out) :: array(:,:,:)
485 character(len=*),
intent(in),
optional :: lev2d
489 integer,
allocatable :: array_int(:,:,:)
490 character(len=1024) :: llev2d
500 if (
present(lev2d)) llev2d = lev2d
501 if (.not.((trim(llev2d)==
'first').or.(trim(llev2d)==
'last')))
call mpl%abort(
'atlas_field_to_array_logical_r3',
'wrong lev2d')
506 allocate(array_int(shp(1),shp(2),shp(3)))
515 deallocate(array_int)
521 # 181 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
523 # 183 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
524 # 184 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
534 type(atlas_field),
intent(inout) :: afield
536 integer(kind_int),
intent(in) :: array(:,:)
537 character(len=*),
intent(in),
optional :: lev2d
540 integer :: nmga,nnodes,nl0,nl2d,il0
542 integer(kind_int),
pointer :: ptr_1(:),ptr_2(:,:)
543 character(len=1024) :: llev2d
553 if (
present(lev2d)) llev2d = lev2d
554 if (.not.((trim(llev2d)==
'first').or.(trim(llev2d)==
'last')))
call mpl%abort(
'atlas_field_from_array_int_r2',
'wrong lev2d')
557 if (afield%kind()/=atlas_integer(
kind_int))
call mpl%abort(
'atlas_field_from_array_int_r2',
'wrong kind for field '//afield%name())
567 nnodes = product(shp(1:2-1))
570 if (nmga/=nnodes)
call mpl%abort(
'atlas_field_from_array_int_r2',
'wrong number of nodes for field '//afield%name())
577 if (afield%levels()==0)
then
578 if (trim(llev2d)==
'first')
then
580 elseif (trim(llev2d)==
'last')
then
583 call afield%data(ptr_1)
584 ptr_1 = array(:,nl2d)
587 if (nl0>afield%levels())
call mpl%abort(
'atlas_field_from_array_int_r2',
'not enough levels in ATLAS field')
588 call afield%data(ptr_2)
590 ptr_2(il0,:) = array(:,il0)
599 # 184 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
609 type(atlas_field),
intent(inout) :: afield
611 real(kind_real),
intent(in) :: array(:,:)
612 character(len=*),
intent(in),
optional :: lev2d
615 integer :: nmga,nnodes,nl0,nl2d,il0
617 real(kind_real),
pointer :: ptr_1(:),ptr_2(:,:)
618 character(len=1024) :: llev2d
628 if (
present(lev2d)) llev2d = lev2d
629 if (.not.((trim(llev2d)==
'first').or.(trim(llev2d)==
'last')))
call mpl%abort(
'atlas_field_from_array_real_r2',
'wrong lev2d')
632 if (afield%kind()/=atlas_real(kind_real))
call mpl%abort(
'atlas_field_from_array_real_r2',
'wrong kind for field '//afield%name())
642 nnodes = product(shp(1:2-1))
645 if (nmga/=nnodes)
call mpl%abort(
'atlas_field_from_array_real_r2',
'wrong number of nodes for field '//afield%name())
652 if (afield%levels()==0)
then
653 if (trim(llev2d)==
'first')
then
655 elseif (trim(llev2d)==
'last')
then
658 call afield%data(ptr_1)
659 ptr_1 = array(:,nl2d)
662 if (nl0>afield%levels())
call mpl%abort(
'atlas_field_from_array_real_r2',
'not enough levels in ATLAS field')
663 call afield%data(ptr_2)
665 ptr_2(il0,:) = array(:,il0)
674 # 259 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
675 # 183 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
676 # 184 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
686 type(atlas_field),
intent(inout) :: afield
688 integer(kind_int),
intent(in) :: array(:,:,:)
689 character(len=*),
intent(in),
optional :: lev2d
692 integer :: nmga,nnodes,nl0,nl2d,il0
694 integer(kind_int),
pointer :: ptr_1(:),ptr_2(:,:)
695 character(len=1024) :: llev2d
705 if (
present(lev2d)) llev2d = lev2d
706 if (.not.((trim(llev2d)==
'first').or.(trim(llev2d)==
'last')))
call mpl%abort(
'atlas_field_from_array_int_r3',
'wrong lev2d')
709 if (afield%kind()/=atlas_integer(
kind_int))
call mpl%abort(
'atlas_field_from_array_int_r3',
'wrong kind for field '//afield%name())
719 nnodes = product(shp(1:3-1))
722 if (nmga/=nnodes)
call mpl%abort(
'atlas_field_from_array_int_r3',
'wrong number of nodes for field '//afield%name())
729 if (afield%levels()==0)
then
730 if (trim(llev2d)==
'first')
then
732 elseif (trim(llev2d)==
'last')
then
735 call afield%data(ptr_1)
737 ptr_1 = reshape(array(:,:,nl2d),(/product(shp(1:2))/))
739 if (nl0>afield%levels())
call mpl%abort(
'atlas_field_from_array_int_r3',
'not enough levels in ATLAS field')
740 call afield%data(ptr_2)
743 ptr_2(il0,:) = reshape(array(:,:,il0),(/product(shp(1:2))/))
751 # 184 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
761 type(atlas_field),
intent(inout) :: afield
763 real(kind_real),
intent(in) :: array(:,:,:)
764 character(len=*),
intent(in),
optional :: lev2d
767 integer :: nmga,nnodes,nl0,nl2d,il0
769 real(kind_real),
pointer :: ptr_1(:),ptr_2(:,:)
770 character(len=1024) :: llev2d
780 if (
present(lev2d)) llev2d = lev2d
781 if (.not.((trim(llev2d)==
'first').or.(trim(llev2d)==
'last')))
call mpl%abort(
'atlas_field_from_array_real_r3',
'wrong lev2d')
784 if (afield%kind()/=atlas_real(kind_real))
call mpl%abort(
'atlas_field_from_array_real_r3',
'wrong kind for field '//afield%name())
794 nnodes = product(shp(1:3-1))
797 if (nmga/=nnodes)
call mpl%abort(
'atlas_field_from_array_real_r3',
'wrong number of nodes for field '//afield%name())
804 if (afield%levels()==0)
then
805 if (trim(llev2d)==
'first')
then
807 elseif (trim(llev2d)==
'last')
then
810 call afield%data(ptr_1)
812 ptr_1 = reshape(array(:,:,nl2d),(/product(shp(1:2))/))
814 if (nl0>afield%levels())
call mpl%abort(
'atlas_field_from_array_real_r3',
'not enough levels in ATLAS field')
815 call afield%data(ptr_2)
818 ptr_2(il0,:) = reshape(array(:,:,il0),(/product(shp(1:2))/))
826 # 259 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
827 # 260 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
829 # 262 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
839 type(atlas_field),
intent(inout) :: afield
841 logical,
intent(in) :: array(:,:)
842 character(len=*),
intent(in),
optional :: lev2d
846 integer,
allocatable :: array_int(:,:)
847 character(len=1024) :: llev2d
857 if (
present(lev2d)) llev2d = lev2d
858 if (.not.((trim(llev2d)==
'first').or.(trim(llev2d)==
'last')))
call mpl%abort(
'atlas_field_from_array_logical_r2',
'wrong lev2d')
862 allocate(array_int(shp(1),shp(2)))
872 deallocate(array_int)
878 # 262 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
888 type(atlas_field),
intent(inout) :: afield
890 logical,
intent(in) :: array(:,:,:)
891 character(len=*),
intent(in),
optional :: lev2d
895 integer,
allocatable :: array_int(:,:,:)
896 character(len=1024) :: llev2d
906 if (
present(lev2d)) llev2d = lev2d
907 if (.not.((trim(llev2d)==
'first').or.(trim(llev2d)==
'last')))
call mpl%abort(
'atlas_field_from_array_logical_r3',
'wrong lev2d')
912 allocate(array_int(shp(1),shp(2),shp(3)))
921 deallocate(array_int)
927 # 311 "/Users/miesch/JEDI/code/working_copy/internal/mpas-bundle/saber/src/saber/util/tools_atlas.fypp"
938 integer,
intent(in) :: nmga
939 real(kind_real),
intent(in) :: lon_mga(nmga)
940 real(kind_real),
intent(in) :: lat_mga(nmga)
941 type(atlas_functionspace),
intent(out) :: afunctionspace
945 real(kind_real),
pointer :: real_ptr(:,:)
946 type(atlas_field) :: afield
955 afield = atlas_field(name=
'lonlat',kind=atlas_real(kind_real),shape=(/2,nmga/))
956 call afield%data(real_ptr)
958 real_ptr(1,imga) = lon_mga(imga)
959 real_ptr(2,imga) = lat_mga(imga)
963 afunctionspace = atlas_functionspace_pointcloud(afield)
980 type(atlas_field),
intent(in) :: afield
986 type(atlas_functionspace) :: afunctionspace
987 type(atlas_functionspace_nodecolumns) :: afunctionspace_nc
988 type(atlas_functionspace_pointcloud) :: afunctionspace_pc
989 type(atlas_functionspace_structuredcolumns) :: afunctionspace_sc
998 afunctionspace = afield%functionspace()
1000 select case (afunctionspace%name())
1001 case (
'NodeColumns')
1003 afunctionspace_nc = afield%functionspace()
1006 nmga = afunctionspace_nc%nb_nodes()
1009 afunctionspace_pc = afield%functionspace()
1012 nmga = afunctionspace_pc%size()
1013 case (
'StructuredColumns')
1015 afunctionspace_sc = afield%functionspace()
1018 nmga = afunctionspace_sc%size_owned()
1020 call mpl%abort(
'atlas_get_atlas_field_size',
'wrong function space for field '//afield%name()//
': '//afunctionspace%name())
Generic ranks, dimensions and types.