LCOV - code coverage report
Current view: top level - ionosphere/waccmx - regridder.F90 (source / functions) Hit Total Coverage
Test: coverage.info Lines: 30 40 75.0 %
Date: 2025-03-14 01:26:08 Functions: 6 8 75.0 %

          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

Generated by: LCOV version 1.14