New URL for NEMO forge!   http://forge.nemo-ocean.eu

Since March 2022 along with NEMO 4.2 release, the code development moved to a self-hosted GitLab.
This present forge is now archived and remained online for history.
Changeset 10025 for utils/tools/NESTING/src/agrif_create_coordinates.f90 – NEMO

Ignore:
Timestamp:
2018-08-02T15:25:27+02:00 (6 years ago)
Author:
clem
Message:

nesting tools are partly rewritten (mostly for create_coordinates and bathy) to get better functionality. Now you can use the nesting to either define an agrif zoom or a regional domain (for bdy purposes). Also, the nesting tools output a domain_cfg.nc that can be directly used in NEMO4 without the need of DOMAINcfg tool. The option of median average for bathymetry interpolation still does not work properly but it's not new

File:
1 edited

Legend:

Unmodified
Added
Removed
  • utils/tools/NESTING/src/agrif_create_coordinates.f90

    r9632 r10025  
    3939  ! 
    4040  ! read input file (namelist.input) 
    41   ! 
    4241  CALL read_namelist(namelistname) 
    43   ! 
    44  
    4542  !       
    4643  ! read parent coodinates file 
    47   ! 
    4844  status = Read_Coordinates(TRIM(parent_coordinate_file),G0) 
    4945  !  
    5046  ! define name of child coordinate file 
    51   !      
    5247  CALL set_child_name(parent_coordinate_file,Child_filename)  
    5348  ! 
     
    6459  ! 
    6560  ! allocation of child grid elements 
    66   ! 
    6761  CALL agrif_grid_allocate(G1,nxfin,nyfin) 
    6862  ! 
    69   ! 
    7063  !  check potential longitude problems  
    71   !       
    7264  IF( G0%glamt(imin,jmin) > G0%glamt(imax,jmax) ) THEN            
    73      WRITE(*,*) '    ' 
    74      WHERE ( G0%glamt < 0 ) 
    75         G0%glamt = G0%glamt + 360. 
    76      END WHERE 
    77      WHERE ( G0%glamf < 0 ) 
    78         G0%glamf = G0%glamf + 360. 
    79      END WHERE 
    80   ENDIF 
    81  
     65     WHERE ( G0%glamt < 0 )   G0%glamt = G0%glamt + 360. 
     66     WHERE ( G0%glamf < 0 )   G0%glamf = G0%glamf + 360. 
     67  ENDIF 
    8268  !       
    8369  ! interpolation from parent grid to child grid for 
     
    8975  !    gphi = latitude 
    9076  ! 
    91  
    9277  !       
    93   !> M. Dunphy ticket 2082: 
    9478  CALL agrif_interp(G0%glamt,G1%glamt,'T') 
    9579  CALL agrif_interp(G0%glamf,G1%glamf,'F') 
    96 !  G1%glamu = G1%glamf 
    97 !  G1%glamv = G1%glamt 
    9880  CALL agrif_interp(G0%glamu,G1%glamu,'U') 
    9981  CALL agrif_interp(G0%glamv,G1%glamv,'V')  
     
    10183  CALL agrif_interp(G0%gphit,G1%gphit,'T') 
    10284  CALL agrif_interp(G0%gphif,G1%gphif,'F') 
    103 !  G1%gphiu = G1%gphit 
    104 !  G1%gphiv = G1%gphif 
    10585  CALL agrif_interp(G0%gphiu,G1%gphiu,'U') 
    10686  CALL agrif_interp(G0%gphiv,G1%gphiv,'V') 
    107   !<  M. Dunphy ticket 2082 
    10887  ! 
    10988  ! 
     
    11392  ! 
    11493  ! Compute scale factors e1 e2 
    115   ! 
    116   DO j=1,nyfin 
    117      DO i=2,nxfin 
    118         G1%e1t(i,j) = ra * rad * SQRT( (COS(rad*G1%gphit(i,j))*(G1%glamu(i,j)-G1%glamu(i-1,j)))**2 & 
    119              + (G1%gphiu(i,j)-G1%gphiu(i-1,j))**2) 
    120         G1%e1v(i,j) = ra * rad * SQRT( (COS(rad*G1%gphiv(i,j))*(G1%glamf(i,j)-G1%glamf(i-1,j)))**2 & 
    121              + (G1%gphif(i,j)-G1%gphif(i-1,j))**2)                                                              
    122      END DO 
    123   END DO 
    124   !       
    125   G1%e1t(1,:)=G1%e1t(2,:) 
    126   G1%e1v(1,:)=G1%e1v(2,:) 
    127   ! 
    128   DO j=1,nyfin 
    129      DO i=1,nxfin-1 
    130         G1%e1u(i,j) = ra * rad * SQRT( (COS(rad*G1%gphiu(i,j))*(G1%glamt(i+1,j)-G1%glamt(i,j)))**2 & 
    131              + (G1%gphit(i+1,j)-G1%gphit(i,j))**2) 
    132         G1%e1f(i,j) = ra * rad * SQRT( (COS(rad*G1%gphif(i,j))*(G1%glamv(i+1,j)-G1%glamv(i,j)))**2 & 
    133              + (G1%gphiv(i+1,j)-G1%gphiv(i,j))**2)                                                             
    134      END DO 
    135   END DO 
    136   ! 
    137   G1%e1u(nxfin,:)=G1%e1u(nxfin-1,:) 
    138   G1%e1f(nxfin,:)=G1%e1f(nxfin-1,:) 
    139   ! 
    140   DO j=2,nyfin 
    141      DO i=1,nxfin                                      
    142         G1%e2t(i,j) = ra * rad * SQRT( (COS(rad*G1%gphit(i,j))*(G1%glamv(i,j)-G1%glamv(i,j-1)))**2 & 
    143              + (G1%gphiv(i,j)-G1%gphiv(i,j-1))**2) 
    144         G1%e2u(i,j) = ra * rad * SQRT( (COS(rad*G1%gphiu(i,j))*(G1%glamf(i,j)-G1%glamf(i,j-1)))**2 & 
    145              + (G1%gphif(i,j)-G1%gphif(i,j-1))**2)                                                                
    146      END DO 
    147   END DO 
    148   ! 
    149   G1%e2t(:,1)=G1%e2t(:,2) 
    150   G1%e2u(:,1)=G1%e2u(:,2) 
    151   ! 
    152   DO j=1,nyfin-1 
    153      DO i=1,nxfin 
    154         G1%e2v(i,j) = ra * rad * SQRT( (COS(rad*G1%gphiv(i,j))*(G1%glamt(i,j+1)-G1%glamt(i,j)))**2 & 
    155              + (G1%gphit(i,j+1)-G1%gphit(i,j))**2) 
    156         G1%e2f(i,j) = ra * rad * SQRT( (COS(rad*G1%gphif(i,j))*(G1%glamu(i,j+1)-G1%glamu(i,j)))**2 & 
    157              + (G1%gphiu(i,j+1)-G1%gphiu(i,j))**2) 
    158      END DO 
    159   END DO 
    160   ! 
    161   G1%e2v(:,nyfin)=G1%e2v(:,nyfin-1) 
    162   G1%e2f(:,nyfin)=G1%e2f(:,nyfin-1) 
    163  
    164  
    165   CALL agrif_interp(G0%e1t,G1%e1t,'T') 
    166   G1%e1t = G1%e1t / REAL(irafx) 
    167   CALL agrif_interp(G0%e2t,G1%e2t,'T') 
    168   G1%e2t = G1%e2t / REAL(irafy) 
    169  
    170   CALL agrif_interp(G0%e1u,G1%e1u,'U') 
    171   G1%e1u = G1%e1u / REAL(irafx) 
    172   CALL agrif_interp(G0%e2u,G1%e2u,'U') 
    173   G1%e2u = G1%e2u / REAL(irafy)   
    174  
    175   CALL agrif_interp(G0%e1v,G1%e1v,'V') 
    176   G1%e1v = G1%e1v / REAL(irafx) 
    177   CALL agrif_interp(G0%e2v,G1%e2v,'V') 
    178   G1%e2v = G1%e2v / REAL(irafy)  
    179  
    180   CALL agrif_interp(G0%e1f,G1%e1f,'F') 
    181   G1%e1f = G1%e1f / REAL(irafx) 
    182   CALL agrif_interp(G0%e2f,G1%e2f,'F') 
    183   G1%e2f = G1%e2f / REAL(irafy)                
    184  
    185   ! 
    186   WHERE ( G1%glamt > 180 ) 
    187      G1%glamt = G1%glamt - 360. 
    188   END WHERE 
    189   WHERE ( G1%glamf > 180 ) 
    190      G1%glamf = G1%glamf - 360. 
    191   END WHERE 
    192   WHERE ( G1%glamu > 180 ) 
    193      G1%glamu = G1%glamu - 360. 
    194   END WHERE 
    195   WHERE ( G1%glamv > 180 ) 
    196      G1%glamv = G1%glamv - 360. 
    197   END WHERE 
    198   ! 
     94!  DO j=1,nyfin 
     95!     DO i=2,nxfin 
     96!        G1%e1t(i,j) = ra * rad * SQRT( (COS(rad*G1%gphit(i,j))*(G1%glamu(i,j)-G1%glamu(i-1,j)))**2 & 
     97!             + (G1%gphiu(i,j)-G1%gphiu(i-1,j))**2) 
     98!        G1%e1v(i,j) = ra * rad * SQRT( (COS(rad*G1%gphiv(i,j))*(G1%glamf(i,j)-G1%glamf(i-1,j)))**2 & 
     99!             + (G1%gphif(i,j)-G1%gphif(i-1,j))**2)                                                              
     100!     END DO 
     101!  END DO 
     102!  !       
     103!  G1%e1t(1,:)=G1%e1t(2,:) 
     104!  G1%e1v(1,:)=G1%e1v(2,:) 
     105!  ! 
     106!  DO j=1,nyfin 
     107!     DO i=1,nxfin-1 
     108!        G1%e1u(i,j) = ra * rad * SQRT( (COS(rad*G1%gphiu(i,j))*(G1%glamt(i+1,j)-G1%glamt(i,j)))**2 & 
     109!             + (G1%gphit(i+1,j)-G1%gphit(i,j))**2) 
     110!        G1%e1f(i,j) = ra * rad * SQRT( (COS(rad*G1%gphif(i,j))*(G1%glamv(i+1,j)-G1%glamv(i,j)))**2 & 
     111!             + (G1%gphiv(i+1,j)-G1%gphiv(i,j))**2)                                                             
     112!     END DO 
     113!  END DO 
     114!  ! 
     115!  G1%e1u(nxfin,:)=G1%e1u(nxfin-1,:) 
     116!  G1%e1f(nxfin,:)=G1%e1f(nxfin-1,:) 
     117!  ! 
     118!  DO j=2,nyfin 
     119!     DO i=1,nxfin                                      
     120!        G1%e2t(i,j) = ra * rad * SQRT( (COS(rad*G1%gphit(i,j))*(G1%glamv(i,j)-G1%glamv(i,j-1)))**2 & 
     121!             + (G1%gphiv(i,j)-G1%gphiv(i,j-1))**2) 
     122!        G1%e2u(i,j) = ra * rad * SQRT( (COS(rad*G1%gphiu(i,j))*(G1%glamf(i,j)-G1%glamf(i,j-1)))**2 & 
     123!             + (G1%gphif(i,j)-G1%gphif(i,j-1))**2)                                                                
     124!     END DO 
     125!  END DO 
     126!  ! 
     127!  G1%e2t(:,1)=G1%e2t(:,2) 
     128!  G1%e2u(:,1)=G1%e2u(:,2) 
     129!  ! 
     130!  DO j=1,nyfin-1 
     131!     DO i=1,nxfin 
     132!        G1%e2v(i,j) = ra * rad * SQRT( (COS(rad*G1%gphiv(i,j))*(G1%glamt(i,j+1)-G1%glamt(i,j)))**2 & 
     133!             + (G1%gphit(i,j+1)-G1%gphit(i,j))**2) 
     134!        G1%e2f(i,j) = ra * rad * SQRT( (COS(rad*G1%gphif(i,j))*(G1%glamu(i,j+1)-G1%glamu(i,j)))**2 & 
     135!             + (G1%gphiu(i,j+1)-G1%gphiu(i,j))**2) 
     136!     END DO 
     137!  END DO 
     138!  ! 
     139!  G1%e2v(:,nyfin)=G1%e2v(:,nyfin-1) 
     140!  G1%e2f(:,nyfin)=G1%e2f(:,nyfin-1) 
     141 
     142 
     143  CALL agrif_interp(G0%e1t,G1%e1t,'T')   ;   G1%e1t = G1%e1t / REAL(irafx) 
     144  CALL agrif_interp(G0%e2t,G1%e2t,'T')   ;   G1%e2t = G1%e2t / REAL(irafy) 
     145 
     146  CALL agrif_interp(G0%e1u,G1%e1u,'U')   ;   G1%e1u = G1%e1u / REAL(irafx) 
     147  CALL agrif_interp(G0%e2u,G1%e2u,'U')   ;   G1%e2u = G1%e2u / REAL(irafy)   
     148 
     149  CALL agrif_interp(G0%e1v,G1%e1v,'V')   ;   G1%e1v = G1%e1v / REAL(irafx) 
     150  CALL agrif_interp(G0%e2v,G1%e2v,'V')   ;   G1%e2v = G1%e2v / REAL(irafy)  
     151 
     152  CALL agrif_interp(G0%e1f,G1%e1f,'F')   ;   G1%e1f = G1%e1f / REAL(irafx) 
     153  CALL agrif_interp(G0%e2f,G1%e2f,'F')   ;   G1%e2f = G1%e2f / REAL(irafy) 
     154  ! 
     155  WHERE ( G1%glamt > 180 )   G1%glamt = G1%glamt - 360. 
     156  WHERE ( G1%glamf > 180 )   G1%glamf = G1%glamf - 360. 
     157  WHERE ( G1%glamu > 180 )   G1%glamu = G1%glamu - 360. 
     158  WHERE ( G1%glamv > 180 )   G1%glamv = G1%glamv - 360. 
    199159  ! 
    200160  G1%nav_lon=G1%glamt 
    201161  G1%nav_lat=G1%gphit  
    202162  !               
    203   ! 
    204163  ! Write interpolation result in child coodinates file 
    205   !       
    206164  status = Write_Coordinates(TRIM(Child_filename),G1) 
    207  
    208165  ! 
    209166  WRITE(*,*) 'Child domain position : ' 
    210   WRITE(*,*) 'latmin =',G1%gphit(3,3) 
    211   WRITE(*,*) 'latmax =',G1%gphit(nxfin-2,nyfin-2) 
    212   WRITE(*,*) 'lonmin =',G1%glamt(3,3) 
    213   WRITE(*,*) 'lonmax =',G1%glamt(nxfin-2,nyfin-2) 
     167  IF( ln_agrif_domain ) THEN 
     168     WRITE(*,*) 'latmin =',G1%gphit(3,3) 
     169     WRITE(*,*) 'latmax =',G1%gphit(nxfin-2,nyfin-2) 
     170     WRITE(*,*) 'lonmin =',G1%glamt(3,3) 
     171     WRITE(*,*) 'lonmax =',G1%glamt(nxfin-2,nyfin-2) 
     172  ELSE 
     173     WRITE(*,*) 'latmin =',G1%gphit(1,1) 
     174     WRITE(*,*) 'latmax =',G1%gphit(nxfin,nyfin) 
     175     WRITE(*,*) 'lonmin =',G1%glamt(1,1) 
     176     WRITE(*,*) 'lonmax =',G1%glamt(nxfin,nyfin) 
     177  ENDIF 
    214178  STOP 
    215179END PROGRAM create_coordinate 
Note: See TracChangeset for help on using the changeset viewer.