Line data Source code
1 : !-------------------------------------------------------------------------------
2 : ! Utility module for mapping fields between CAM physics, oplus transport, and
3 : ! geomagnetic grids
4 : !-------------------------------------------------------------------------------
5 : module regridder
6 : use shr_kind_mod,only: r8 => shr_kind_r8 ! 8-byte reals
7 : use cam_abortutils, only: endrun
8 :
9 : use edyn_mpi, only: mlon0, mlon1, mlat0, mlat1, mlev0, mlev1
10 : use edyn_mpi, only: lon0, lon1, lat0, lat1, lev0, lev1
11 :
12 : use edyn_esmf, only: edyn_esmf_set3d_phys, edyn_esmf_regrid_phys2mag
13 : use edyn_esmf, only: edyn_esmf_regrid_phys2geo, edyn_esmf_get_3dfield
14 : use edyn_esmf, only: edyn_esmf_set2d_phys, edyn_esmf_get_2dfield, edyn_esmf_get_2dphysfield, edyn_esmf_set3d_geo
15 : use edyn_esmf, only: edyn_esmf_regrid_geo2mag, edyn_esmf_regrid_geo2phys
16 : use edyn_esmf, only: edyn_esmf_set2d_geo, edyn_esmf_set3d_mag, edyn_esmf_regrid_mag2geo
17 : use edyn_esmf, only: phys_3dfld, phys_2dfld
18 : use edyn_esmf, only: geo_3dfld, geo_2dfld
19 : use edyn_esmf, only: mag_des_3dfld, mag_des_2dfld
20 : use edyn_esmf, only: mag_src_3dfld, mag_src_2dfld
21 : use edyn_esmf, only: edyn_esmf_set2d_mag, edyn_esmf_regrid_mag2phys, edyn_esmf_get_1dfield
22 :
23 : implicit none
24 :
25 : contains
26 :
27 : !-----------------------------------------------------------------------------
28 : ! map horizontal 2D fields from magnetic grid to physcis grid
29 : !-----------------------------------------------------------------------------
30 0 : subroutine regrid_mag2phys_2d(magfld, physfld, cols, cole)
31 : integer, intent(in) :: cols, cole
32 : real(r8), intent(in) :: magfld(mlon0:mlon1,mlat0:mlat1)
33 : real(r8), intent(out) :: physfld(cols:cole)
34 :
35 0 : call edyn_esmf_set2d_mag( mag_src_2dfld, magfld, mlon0, mlon1, mlat0, mlat1 )
36 0 : call edyn_esmf_regrid_mag2phys( mag_src_2dfld, phys_2dfld, 2)
37 0 : call edyn_esmf_get_1dfield(phys_2dfld, physfld, cols, cole )
38 :
39 0 : end subroutine regrid_mag2phys_2d
40 :
41 : !-----------------------------------------------------------------------------
42 : ! map 3D feilds from magnetic grid to oplus grid
43 : !-----------------------------------------------------------------------------
44 29184 : subroutine regrid_mag2geo_3d(magfld,geofld)
45 : real(r8), intent(in) :: magfld(mlon0:mlon1,mlat0:mlat1,mlev0:mlev1)
46 : real(r8), intent(out) :: geofld(lon0:lon1,lat0:lat1,lev0:lev1)
47 :
48 29184 : call edyn_esmf_set3d_mag( mag_src_3dfld, magfld, mlon0, mlon1, mlat0, mlat1, mlev0, mlev1 )
49 29184 : call edyn_esmf_regrid_mag2geo(mag_src_3dfld, geo_3dfld, 3)
50 29184 : call edyn_esmf_get_3dfield(geo_3dfld, geofld, lon0, lon1, lat0, lat1, lev0, lev1)
51 :
52 29184 : end subroutine regrid_mag2geo_3d
53 :
54 : !-----------------------------------------------------------------------------
55 : ! map horizontal 2D fields from physcis grid to oplus grid
56 : !-----------------------------------------------------------------------------
57 0 : subroutine regrid_phys2geo_2d( physfld, geofld, cols, cole )
58 : integer, intent(in) :: cols, cole
59 : real(r8), intent(in) :: physfld(cols:cole)
60 : real(r8), intent(out) :: geofld(lon0:lon1,lat0:lat1)
61 :
62 0 : call edyn_esmf_set2d_phys( phys_2dfld , physfld, cols, cole)
63 0 : call edyn_esmf_regrid_phys2geo(phys_2dfld, geo_2dfld, 2)
64 0 : call edyn_esmf_get_2dfield(geo_2dfld, geofld, lon0, lon1, lat0, lat1 )
65 :
66 0 : end subroutine regrid_phys2geo_2d
67 :
68 : !-----------------------------------------------------------------------------
69 : ! map 3D fields from physcis grid to oplus grid
70 : !-----------------------------------------------------------------------------
71 131328 : subroutine regrid_phys2geo_3d( physfld, geofld, plev, cols, cole )
72 : integer, intent(in) :: plev, cols, cole
73 : real(r8), intent(in) :: physfld(1:plev,cols:cole)
74 : real(r8), intent(out) :: geofld(lon0:lon1,lat0:lat1,lev0:lev1)
75 :
76 131328 : call edyn_esmf_set3d_phys( phys_3dfld, physfld, 1, plev, cols, cole)
77 131328 : call edyn_esmf_regrid_phys2geo(phys_3dfld, geo_3dfld, 3)
78 131328 : call edyn_esmf_get_3dfield(geo_3dfld, geofld, lon0, lon1, lat0, lat1, lev0, lev1 )
79 :
80 131328 : end subroutine regrid_phys2geo_3d
81 :
82 : !-----------------------------------------------------------------------------
83 : ! map 3D fields from oplus grid to magnetic grid
84 : !-----------------------------------------------------------------------------
85 14592 : subroutine regrid_geo2mag_3d( geofld, magfld )
86 : real(r8), intent(in) :: geofld(lon0:lon1,lat0:lat1,lev0:lev1)
87 : real(r8), intent(out) :: magfld(mlon0:mlon1,mlat0:mlat1,mlev0:mlev1)
88 :
89 14592 : call edyn_esmf_set3d_geo( geo_3dfld, geofld, lon0, lon1, lat0, lat1, lev0, lev1 )
90 14592 : call edyn_esmf_regrid_geo2mag(geo_3dfld, mag_des_3dfld, 3)
91 14592 : call edyn_esmf_get_3dfield(mag_des_3dfld, magfld, mlon0, mlon1, mlat0, mlat1, mlev0, mlev1 )
92 :
93 14592 : end subroutine regrid_geo2mag_3d
94 :
95 : !-----------------------------------------------------------------------------
96 : ! map horizontal 2D fields from oplus grid to magnetic grid
97 : !-----------------------------------------------------------------------------
98 36480 : subroutine regrid_geo2mag_2d( geofld, magfld )
99 : real(r8), intent(in) :: geofld(lon0:lon1,lat0:lat1)
100 : real(r8), intent(out) :: magfld(mlon0:mlon1,mlat0:mlat1)
101 :
102 36480 : call edyn_esmf_set2d_geo( geo_2dfld, geofld, lon0, lon1, lat0, lat1 )
103 36480 : call edyn_esmf_regrid_geo2mag(geo_2dfld, mag_des_2dfld, 2)
104 36480 : call edyn_esmf_get_2dfield(mag_des_2dfld, magfld, mlon0, mlon1, mlat0, mlat1 )
105 :
106 36480 : end subroutine regrid_geo2mag_2d
107 :
108 : !-----------------------------------------------------------------------------
109 : ! map 3D fields from oplus grid to physics grid
110 : !-----------------------------------------------------------------------------
111 36480 : subroutine regrid_geo2phys_3d( geofld, physfld, plev, cols, cole )
112 : integer, intent(in) :: plev, cols, cole
113 : real(r8), intent(in) :: geofld(lon0:lon1,lat0:lat1,lev0:lev1)
114 : real(r8), intent(out) :: physfld(1:plev,cols:cole)
115 :
116 :
117 36480 : call edyn_esmf_set3d_geo( geo_3dfld, geofld, lon0, lon1, lat0, lat1, lev0, lev1 )
118 36480 : call edyn_esmf_regrid_geo2phys(geo_3dfld, phys_3dfld, 3)
119 36480 : call edyn_esmf_get_2dphysfield(phys_3dfld, physfld, 1, plev, cols, cole )
120 :
121 36480 : end subroutine regrid_geo2phys_3d
122 :
123 : !-----------------------------------------------------------------------------
124 : ! map 3D fields from physics grid to magnetic
125 : !-----------------------------------------------------------------------------
126 21888 : subroutine regrid_phys2mag_3d( physfld, magfld, plev, cols, cole )
127 : integer, intent(in) :: plev, cols, cole
128 : real(r8), intent(in) :: physfld(1:plev,cols:cole)
129 : real(r8), intent(out) :: magfld(mlon0:mlon1,mlat0:mlat1,mlev0:mlev1)
130 :
131 21888 : call edyn_esmf_set3d_phys( phys_3dfld, physfld, 1, plev, cols, cole)
132 21888 : call edyn_esmf_regrid_phys2mag(phys_3dfld, mag_des_3dfld, 3)
133 21888 : call edyn_esmf_get_3dfield(mag_des_3dfld, magfld, mlon0, mlon1, mlat0, mlat1, mlev0, mlev1 )
134 :
135 21888 : end subroutine regrid_phys2mag_3d
136 :
137 : end module regridder
|