Changeset 913


Ignore:
Timestamp:
06/17/19 17:38:58 (5 years ago)
Author:
dubos
Message:

devel : compute_pression for unstructured mesh

Location:
codes/icosagcm/devel/src
Files:
16 edited
1 moved

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/src/base/init_grid_param.f90

    r906 r913  
    33  USE compute_diagnostics_mod 
    44  USE compute_rhodz_mod 
     5  USE compute_pression_mod 
    56 
    67  USE compute_caldyn_mod 
     
    5758 
    5859  SUBROUTINE select_compute_hex 
    59     compute_rhodz      => compute_rhodz_hex 
    60     compute_pvort_only => compute_pvort_only_hex 
     60    ! diagnostics 
     61    compute_rhodz        => compute_rhodz_hex 
     62    compute_pression     => compute_pression_hex 
     63    compute_pression_mid => compute_pression_mid_hex 
     64    ! dynamics 
     65    compute_pvort_only   => compute_pvort_only_hex 
    6166  END SUBROUTINE select_compute_hex 
    6267 
    6368  SUBROUTINE select_compute_unst 
    64     compute_rhodz      => compute_rhodz_unst 
    65     compute_pvort_only => compute_pvort_only_unst 
     69    ! diagnostics 
     70    compute_rhodz        => compute_rhodz_unst 
     71    compute_pression     => compute_pression_unst 
     72    compute_pression_mid => compute_pression_mid_unst 
     73    ! dynamics 
     74    compute_pvort_only   => compute_pvort_only_unst 
    6675  END SUBROUTINE select_compute_unst 
    6776 
  • codes/icosagcm/devel/src/diagnostics/check_conserve.f90

    r908 r913  
    11MODULE check_conserve_mod 
    22  USE icosa  
     3  USE compute_pression_mod, ONLY : pression 
    34  IMPLICIT NONE  
    4  
    55  PRIVATE 
    66   
     
    5252 
    5353  SUBROUTINE check_conserve(f_ps,f_dps,f_ue,f_theta_rhodz,f_phis,it)  
    54   USE pression_mod 
    5554  USE vorticity_mod 
    5655  USE caldyn_gcm_mod 
     
    129128 
    130129       IF(check_type == check_detailed) THEN 
    131           !ang_mass = AAM_mass-AAM_mass_old  
    132           !WRITE(*,'(A,3E12.4)') 'AAM_mass sanity check', SUM(AAM_mass_source), ang_mass, SUM(AAM_mass_source)-ang_mass 
    133           !ang_vel = AAM_vel-AAM_vel_old  
    134           !WRITE(*,'(A,3E12.4)') 'AAM_vel  sanity check', SUM(AAM_vel_source), ang_vel, SUM(AAM_vel_source)-ang_vel 
    135130          WRITE(*,'(A,6E14.6)') 'AAM_mass : time,old,new,dissip,dyn,phys', dt*it, AAM_mass_old, AAM_mass, & 
    136131               AAM_mass_source(AAM_dissip), AAM_mass_source(AAM_dyn), AAM_mass_source(AAM_phys) 
     
    158153 
    159154  SUBROUTINE check_conserve_detailed(it,tag, f_ps,f_dps,f_ue,f_theta_rhodz,f_phis)  
    160     USE pression_mod 
    161155    USE vorticity_mod 
    162156    USE caldyn_gcm_mod 
     
    196190          ! ang_XXX = value of total AAM_XXX now 
    197191          ! AAM_XXX_source(tag) = source of AAA_XXX due to tag=dissip,dyn,phys 
    198           !WRITE(*,'(A,3E12.2)') 'AAM_mass', tag, ang_mass, AAM_mass, ang_mass-AAM_mass ! FIXME 
    199           !WRITE(*,'(A,3E12.2)') 'AAM_vel ', tag, ang_vel, AAM_vel, ang_vel-AAM_vel ! FIXME 
    200192          AAM_mass_source(tag) = AAM_mass_source(tag) + ang_mass - AAM_mass 
    201193          AAM_vel_source(tag) = AAM_vel_source(tag) + ang_vel - AAM_vel 
     
    276268  SUBROUTINE check_energy(f_ue,f_theta_rhodz,f_phis, etot, & 
    277269                      stot, AAM_mass_tot, AAM_vel_tot, AAM_velp_tot, AAM_velm_tot, rmsvtot)   
    278   USE pression_mod 
    279270  USE vorticity_mod 
    280271    TYPE(t_field), POINTER :: f_ue(:) 
  • codes/icosagcm/devel/src/diagnostics/compute_diagnostics.f90

    r906 r913  
    1212    END SUBROUTINE comp_rhodz 
    1313 
     14    SUBROUTINE comp_pression(ps, p, offset) 
     15      USE prec, ONLY : rstd 
     16      INTEGER, INTENT(IN) :: offset 
     17      REAL(rstd), INTENT(IN) :: ps(1) 
     18      REAL(rstd), INTENT(OUT) :: p(1,1) 
     19    END SUBROUTINE comp_pression 
    1420  END INTERFACE 
    1521 
    1622  PROCEDURE(comp_rhodz), POINTER :: compute_rhodz 
     23  PROCEDURE(comp_pression), POINTER :: compute_pression, compute_pression_mid 
    1724 
    1825END MODULE compute_diagnostics_mod 
  • codes/icosagcm/devel/src/diagnostics/compute_pression.F90

    r905 r913  
    1 MODULE pression_mod 
     1MODULE compute_pression_mod 
     2  USE compute_diagnostics_mod 
     3  USE icosa 
     4  USE omp_para 
     5  USE disvert_mod, ONLY : ap, bp, ap_bp_present 
     6  IMPLICIT NONE 
     7  PRIVATE 
     8 
     9#include "../unstructured/unstructured.h90" 
     10 
     11  PUBLIC :: pression, compute_pression_hex, compute_pression_unst, & 
     12       pression_mid, compute_pression_mid_hex, compute_pression_mid_unst 
    213 
    314CONTAINS 
    415 
     16#ifdef BEGIN_DYSL 
     17 
     18{%- macro compute_pression(llmax)%}  
     19{%- set inner_loop=caller() %} 
     20{%- set llmax="'%s'"%llmax %} 
     21IF(ap_bp_present) THEN 
     22   IF(offset>0) THEN 
     23     FORALL_CELLS_EXT('1',{{ llmax }}) 
     24       ON_PRIMAL 
     25         {{ inner_loop }} 
     26       END_BLOCK 
     27     END_BLOCK 
     28  ELSE 
     29     FORALL_CELLS('1',{{ llmax }}) 
     30       ON_PRIMAL 
     31         {{ inner_loop }} 
     32       END_BLOCK 
     33     END_BLOCK 
     34  END IF 
     35END IF 
     36{%- endmacro %} 
     37 
     38KERNEL(compute_pression) 
     39{% call compute_pression('llm+1') %} 
     40p(CELL) = AP(CELL) + BP(CELL) * ps(HIDX(CELL))   
     41{% endcall %} 
     42END_BLOCK 
     43 
     44KERNEL(compute_pmid) 
     45{% call compute_pression('llm') %} 
     46pmid(CELL) = .5*(AP(CELL)+AP(UP(CELL)) + (BP(CELL)+BP(UP(CELL))) * ps(HIDX(CELL)) )   
     47{% endcall %} 
     48END_BLOCK 
     49 
     50#endif END_DYSL 
     51 
    552  SUBROUTINE pression(f_ps,f_p) 
    6   USE icosa 
    7   IMPLICIT NONE 
    853    TYPE(t_field), POINTER :: f_ps(:) 
    954    TYPE(t_field), POINTER :: f_p(:) 
     
    2772 
    2873  SUBROUTINE pression_mid(f_ps,f_pmid) 
    29   USE icosa 
    30   IMPLICIT NONE 
    3174    TYPE(t_field), POINTER :: f_ps(:) 
    3275    TYPE(t_field), POINTER :: f_pmid(:) 
     
    4992  END SUBROUTINE pression_mid 
    5093 
    51   SUBROUTINE compute_pression(ps,p,offset) 
    52   USE icosa 
    53   USE disvert_mod 
    54   USE omp_para 
    55   IMPLICIT NONE 
     94!------------- hexagonal-mesh compute kernels -------- 
     95 
     96#define AP(ij,l) ap(l) 
     97#define BP(ij,l) bp(l) 
     98 
     99  SUBROUTINE compute_pression_hex(ps,p,offset) 
    56100    REAL(rstd),INTENT(IN) :: ps(iim*jjm) 
    57101    REAL(rstd),INTENT(OUT) :: p(iim*jjm,llm+1) 
    58102    INTEGER,INTENT(IN) :: offset 
    59     INTEGER :: i,j,ij,l 
    60  
    61     IF(ap_bp_present) THEN 
    62       DO    l    = ll_begin, ll_endp1 
    63 !      DO    l    = 1, llm + 1 
    64         DO j=jj_begin-offset,jj_end+offset 
    65           DO i=ii_begin-offset,ii_end+offset 
    66             ij=(j-1)*iim+i 
    67             p(ij,l) = ap(l) + bp(l) * ps(ij) 
    68           ENDDO 
    69         ENDDO 
    70       ENDDO 
    71     END IF 
    72  
    73   END SUBROUTINE compute_pression 
     103    INTEGER :: ij,l 
     104#include "../kernels_hex/compute_pression.k90" 
     105  END SUBROUTINE compute_pression_hex 
    74106   
    75   SUBROUTINE compute_pression_mid(ps,pmid,offset) 
    76   USE icosa 
    77   USE disvert_mod 
    78   USE omp_para 
    79   IMPLICIT NONE 
     107  SUBROUTINE compute_pression_mid_hex(ps,pmid,offset) 
    80108    REAL(rstd),INTENT(IN) :: ps(iim*jjm) 
    81109    REAL(rstd),INTENT(OUT) :: pmid(iim*jjm,llm) 
    82110    INTEGER,INTENT(IN) :: offset 
    83     INTEGER :: i,j,ij,l 
     111    INTEGER :: ij,l 
     112#include "../kernels_hex/compute_pmid.k90" 
     113  END SUBROUTINE compute_pression_mid_hex 
    84114 
    85     IF(ap_bp_present) THEN 
    86       DO    l    = ll_begin, ll_end 
    87         DO j=jj_begin-offset,jj_end+offset 
    88           DO i=ii_begin-offset,ii_end+offset 
    89             ij=(j-1)*iim+i 
    90             pmid(ij,l) = 0.5*(ap(l)+ap(l+1) + (bp(l)+bp(l+1)) * ps(ij)) 
    91           ENDDO 
    92         ENDDO 
    93       ENDDO 
    94     END IF 
     115#undef AP 
     116#undef BP 
    95117 
    96   END SUBROUTINE compute_pression_mid 
     118!----------- unstructured-mesh compute kernels -------- 
    97119 
    98 END MODULE pression_mod 
     120#define AP(l,ij) ap(l) 
     121#define BP(l,ij) bp(l) 
     122   
     123  SUBROUTINE compute_pression_unst(ps, p, offset) 
     124    FIELD_PS,     INTENT(IN)  :: ps 
     125    FIELD_GEOPOT, INTENT(OUT) :: p 
     126    INTEGER,      INTENT(IN)  :: offset 
     127    DECLARE_INDICES 
     128#include "../kernels_unst/compute_pression.k90" 
     129  END SUBROUTINE compute_pression_unst 
     130 
     131  SUBROUTINE compute_pression_mid_unst(ps, pmid, offset) 
     132    FIELD_PS,   INTENT(IN)  :: ps 
     133    FIELD_MASS, INTENT(OUT) :: pmid 
     134    INTEGER,    INTENT(IN)  :: offset 
     135    DECLARE_INDICES 
     136#include "../kernels_unst/compute_pmid.k90" 
     137  END SUBROUTINE compute_pression_mid_unst 
     138 
     139#undef AP 
     140#undef BP 
     141 
     142END MODULE compute_pression_mod 
  • codes/icosagcm/devel/src/diagnostics/exner.f90

    r533 r913  
    11MODULE exner_mod 
     2  USE icosa 
     3  IMPLICIT NONE 
     4  PRIVATE 
     5  SAVE 
    26 
    3   INTEGER,SAVE :: caldyn_exner 
     7  INTEGER :: caldyn_exner 
    48!$OMP THREADPRIVATE(caldyn_exner) 
    59 
    610  INTEGER, PARAMETER :: lmdz=3, direct=4 
     11   
     12  PUBLIC :: exner, compute_exner 
    713 
    814CONTAINS 
    915   
    1016  SUBROUTINE exner(f_ps,f_p,f_pks,f_pk) 
    11   USE icosa 
    12   IMPLICIT NONE 
    1317    TYPE(t_field), POINTER :: f_ps(:)  ! IN 
    1418    TYPE(t_field), POINTER :: f_p(:)   ! IN 
     
    3842   
    3943  SUBROUTINE compute_exner(ps,p,pks,pk,offset) 
    40   USE icosa 
    41   USE disvert_mod 
    42   USE pression_mod 
    43   USE omp_para 
    44   IMPLICIT NONE 
     44    USE disvert_mod 
     45    USE omp_para 
    4546    REAL(rstd),INTENT(IN) :: ps(iim*jjm) 
    4647    REAL(rstd),INTENT(IN) :: p(iim*jjm,llm+1) 
  • codes/icosagcm/devel/src/diagnostics/geopotential_mod.f90

    r533 r913  
    99    USE icosa 
    1010    USE omp_para 
    11     USE pression_mod 
     11    USE compute_diagnostics_mod, ONLY : compute_pression 
    1212    USE theta2theta_rhodz_mod 
    1313    TYPE(t_field), POINTER :: f_ps(:), f_phis(:), f_theta_rhodz(:), &  ! IN                                        
  • codes/icosagcm/devel/src/diagnostics/observable.f90

    r906 r913  
    4343    USE xios_mod 
    4444    USE earth_const 
    45     USE pression_mod 
     45    USE compute_pression_mod, ONLY : pression_mid 
    4646    USE vertical_interp_mod 
    4747    USE theta2theta_rhodz_mod 
     
    295295  SUBROUTINE diagnose_temperature(f_pmid,f_q,f_temp) 
    296296    USE icosa 
    297     USE pression_mod 
    298297    IMPLICIT NONE 
    299298    TYPE(t_field), POINTER :: f_pmid(:)         ! IN 
     
    319318  SUBROUTINE compute_diagnose_temp(pmid,q,temp) 
    320319    USE omp_para 
    321     USE pression_mod 
    322320    REAL(rstd),INTENT(IN)    :: pmid(iim*jjm,llm) 
    323321    REAL(rstd),INTENT(IN)    :: q(iim*jjm,llm,nqtot) 
  • codes/icosagcm/devel/src/diagnostics/theta_rhodz.f90

    r533 r913  
    11MODULE theta2theta_rhodz_mod 
     2  USE icosa 
    23  USE field_mod 
     4  USE compute_diagnostics_mod 
     5  IMPLICIT NONE 
    36  PRIVATE 
     7 
    48  TYPE(t_field), POINTER, SAVE  :: f_p(:) 
    59 
     
    1216   
    1317  SUBROUTINE init_theta2theta_rhodz 
    14   USE icosa 
    15   USE field_mod 
    16   IMPLICIT NONE 
    1718    CALL allocate_field(f_p,field_t,type_real,llm+1,name='p (theta2theta_rhodz_mod)')     
    1819  END SUBROUTINE init_theta2theta_rhodz 
     
    2021 
    2122  SUBROUTINE theta_rhodz2theta(f_ps,f_theta_rhodz,f_theta) 
    22   USE icosa 
    23   IMPLICIT NONE 
    2423    TYPE(t_field), POINTER :: f_ps(:) 
    2524    TYPE(t_field), POINTER :: f_theta_rhodz(:) 
     
    4645 
    4746  SUBROUTINE theta_rhodz2temperature(f_ps,f_theta_rhodz,f_temp) 
    48   USE icosa 
    49   USE pression_mod 
    50   IMPLICIT NONE 
    5147    TYPE(t_field), POINTER :: f_ps(:) 
    5248    TYPE(t_field), POINTER :: f_theta_rhodz(:) 
     
    7874  
    7975  SUBROUTINE temperature2theta_rhodz(f_ps,f_temp,f_theta_rhodz) 
    80   USE icosa 
    81   USE pression_mod 
    8276  USE exner_mod 
    8377  IMPLICIT NONE 
     
    113107     
    114108  SUBROUTINE theta2theta_rhodz(f_ps,f_theta,f_theta_rhodz) 
    115   USE icosa 
    116   IMPLICIT NONE 
    117109    TYPE(t_field), POINTER :: f_ps(:) 
    118110    TYPE(t_field), POINTER :: f_theta(:) 
     
    139131   
    140132  SUBROUTINE compute_theta2theta_rhodz(ps,theta, theta_rhodz,offset) 
    141   USE icosa 
    142133  USE disvert_mod 
    143134  USE omp_para 
    144   IMPLICIT NONE 
    145135    REAL(rstd),INTENT(IN) :: ps(iim*jjm) 
    146136    REAL(rstd),INTENT(IN) :: theta(iim*jjm,llm) 
     
    166156 
    167157  SUBROUTINE compute_theta_rhodz2theta(ps,theta_rhodz,theta,offset) 
    168   USE icosa 
    169158  USE disvert_mod 
    170159  USE omp_para 
    171   IMPLICIT NONE 
    172160    REAL(rstd),INTENT(IN) :: ps(iim*jjm) 
    173161    REAL(rstd),INTENT(IN) :: theta_rhodz(iim*jjm,llm) 
     
    198186 
    199187  SUBROUTINE compute_theta_rhodz2temperature(p,theta_rhodz,temp,offset) 
    200   USE icosa 
    201   USE pression_mod 
    202188  USE exner_mod 
    203189  USE omp_para 
    204   IMPLICIT NONE 
    205190    REAL(rstd),INTENT(IN) :: p(iim*jjm,llm+1) 
    206191    REAL(rstd),INTENT(IN) :: theta_rhodz(iim*jjm,llm) 
     
    227212 
    228213  SUBROUTINE compute_temperature2theta_rhodz(p,temp,theta_rhodz,offset) 
    229   USE icosa 
    230   USE pression_mod 
    231214  USE exner_mod 
    232215  USE omp_para 
    233   IMPLICIT NONE 
    234216    REAL(rstd),INTENT(IN)  :: p(iim*jjm,llm+1) 
    235217    REAL(rstd),INTENT(OUT) :: theta_rhodz(iim*jjm,llm) 
  • codes/icosagcm/devel/src/dissip/nudging_mod.f90

    r886 r913  
    147147    USE transfert_mod 
    148148    USE time_mod 
    149     USE pression_mod 
    150149    REAL(rstd), INTENT(IN):: tt 
    151150    TYPE(t_field),POINTER :: f_ps(:) 
  • codes/icosagcm/devel/src/dissip/sponge.f90

    r533 r913  
    8989  USE icosa 
    9090  USE theta2theta_rhodz_mod 
    91   USE pression_mod 
    9291  USE exner_mod 
    9392  USE geopotential_mod 
  • codes/icosagcm/devel/src/initial/etat0_academic.f90

    r531 r913  
    7676  USE icosa 
    7777  USE disvert_mod 
    78   USE pression_mod 
     78  USE compute_diagnostics_mod, ONLY : compute_pression 
    7979  USE exner_mod 
    8080  USE geopotential_mod 
  • codes/icosagcm/devel/src/initial/etat0_database.f90

    r726 r913  
    11MODULE etat0_database_mod 
     2  IMPLICIT NONE 
    23 
    34 
     
    78  USE xios_mod 
    89  USE omp_para 
    9   IMPLICIT NONE 
    1010   
    1111    IF (is_omp_master) THEN 
     
    2727  USE theta2theta_rhodz_mod 
    2828  USE qsat_mod 
    29   USE pression_mod 
     29  USE compute_pression_mod, ONLY : pression 
    3030  USE omp_para 
    31   IMPLICIT NONE 
    3231    TYPE(t_field),POINTER :: f_ps(:) 
    3332    TYPE(t_field),POINTER :: f_phis(:) 
  • codes/icosagcm/devel/src/kernels_unst/theta.k90

    r878 r913  
    1717         !DIR$ SIMD 
    1818         DO l = 1, llm 
    19             ! FIXME : formula below (used in DYNAMICO) is for dak, dbk based on pressure rather than mass 
     19            ! FIXME : formula below (used in DYNAMICO) is for dak, dbk based on 
     20            ! pressure rather than mass 
    2021            ! m = mass_dak(l,ij)+(mass_col(ij)*g+ptop)*mass_dbk(l,ij) 
    2122            ! rhodz(l,ij) = m/g 
  • codes/icosagcm/devel/src/physics/physics.f90

    r741 r913  
    284284  SUBROUTINE pack_physics(info, phis, geopot, ps, temp, ue, q, p, pk, ulon, ulat ) 
    285285    USE wind_mod 
    286     USE pression_mod 
     286    USE compute_diagnostics_mod 
    287287    USE theta2theta_rhodz_mod 
    288288    USE exner_mod 
  • codes/icosagcm/devel/src/physics/physics_lmdz_generic.F90

    r584 r913  
    461461     
    462462    SUBROUTINE grid_icosa_to_physics 
    463     USE pression_mod 
    464463    USE exner_mod 
    465464    USE theta2theta_rhodz_mod 
  • codes/icosagcm/devel/src/vertical/vertical_interp.f90

    r531 r913  
    11MODULE vertical_interp_mod 
    22  USE icosa 
     3  USE omp_para 
     4  USE compute_diagnostics_mod 
     5  IMPLICIT NONE 
    36  PRIVATE 
    47   
     
    1013CONTAINS 
    1114 
    12   SUBROUTINE init_vertical_interp 
    13   USE icosa 
    14   IMPLICIT NONE 
    15      
     15  SUBROUTINE init_vertical_interp     
    1616!    CALL allocate_field(f_p,field_t,type_real,llm+1) 
    17      
    1817  END SUBROUTINE init_vertical_interp 
    1918     
    2019  SUBROUTINE vertical_interp(f_pmid,f_in,f_out,pval) 
    21   USE icosa 
    22   USE pression_mod 
    23   USE omp_para 
    24   IMPLICIT NONE 
    2520    TYPE(t_field),POINTER :: f_pmid(:) 
    2621    TYPE(t_field),POINTER :: f_in(:) 
     
    4742 
    4843  SUBROUTINE compute_vertical_interp(pmid,in,out,pval) 
    49   USE omp_para 
    50   IMPLICIT NONE 
    5144    REAL(rstd),INTENT(IN) :: pmid(iim*jjm,llm) 
    5245    REAL(rstd),INTENT(IN) :: in(iim*jjm,llm) 
  • codes/icosagcm/devel/src/vertical/vertical_remap.f90

    r530 r913  
    11MODULE vertical_remap_mod 
    22  USE icosa 
    3    
     3  USE omp_para 
     4  IMPLICIT NONE 
     5  PRIVATE 
     6 
     7  PUBLIC :: vertical_remap 
    48 
    59CONTAINS 
     
    711    
    812  SUBROUTINE vertical_remap(pressure_level,field_in,f_ps,field_out) 
    9   USE icosa 
    10   USE pression_mod 
    11   USE omp_para 
    12   IMPLICIT NONE 
     13    USE compute_pression_mod, ONLY : pression 
    1314    REAL(rstd), INTENT(IN) :: pressure_level(:) 
    1415    TYPE(t_field),POINTER :: field_in(:) 
     
    3940 
    4041  SUBROUTINE compute_vertical_remap(pressure_level,in,p,out) 
    41   USE omp_para 
    42   IMPLICIT NONE 
    4342    REAL(rstd),INTENT(IN)  :: pressure_level(:) 
    4443    REAL(rstd),INTENT(IN)  :: in(:,:) 
Note: See TracChangeset for help on using the changeset viewer.