Ignore:
Timestamp:
12/19/17 15:26:51 (7 years ago)
Author:
dubos
Message:

devel/unstructured : bubble test case with Fortran time stepping

Location:
codes/icosagcm/devel/Python/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • codes/icosagcm/devel/Python/src/functions.h

    r639 r642  
    77void dynamico_init_params(void); 
    88 
    9 void dynamico_ARK_step(double *mass_col, double *rhodz, double *theta_rhodz,  
     9void dynamico_ARK_step(int nstep, 
     10                       double *mass_col, double *rhodz, double *theta_rhodz,  
    1011                       double *u, double *geopot, double *w, 
    1112                       double *theta, double *ps, double *pk, double *hflux, double *qv, 
  • codes/icosagcm/devel/Python/src/unstructured.pyx

    r640 r642  
    1818 
    1919cdef extern from "functions.h": 
    20      cdef void dynamico_ARK_step(double *mass_col, double *rhodz, double *theta_rhodz,  
     20     cdef void dynamico_ARK_step(int nstep, 
     21                                 double *mass_col, double *rhodz, double *theta_rhodz,  
    2122                                 double *u, double *geopot, double *w, 
    2223                                 double *theta, double *ps, double *pk, double *hflux, double *qv, 
     
    7879cdef dbl_ptr ptr2(double[:,:] data) : return &data[0,0] 
    7980cdef dbl_ptr ptr3(double[:,:,:] data) : return &data[0,0,0] 
     81cdef dbl_ptr ptr4(double[:,:,:,:] data) : return &data[0,0,0,0] 
    8082cdef dbl_ptr ptr(data): 
    8183    n=data.ndim 
     
    8385    if n==2 : return ptr2(data) 
    8486    if n==3 : return ptr3(data) 
    85  
     87    if n==4 : return ptr4(data) 
     88    if n>4: raise IndexError 
     89         
    8690cdef alloc(dbl_ptr *p, allocator, n=1): 
    8791    data=allocator(n) 
     
    9397         
    9498cdef class Caldyn_step: 
     99    # number of time steps to do at each invocation of advance() 
     100    cdef int nstep 
    95101    # pointer to allocated arrays 
    96     cdef dbl_ptr p_mass, p_theta_rhodz, p_u, p_geopot, p_w                   # prognostic 
     102    cdef dbl_ptr p_mass, p_theta_rhodz, p_u, p_geopot, p_W                   # prognostic 
    97103    cdef dbl_ptr p_mass_col, p_dmass_col, p_ps, p_theta, p_pk, p_hflux, p_qv # diagnostic 
    98104    cdef dbl_ptr p_drhodz, p_dtheta_rhodz, p_du_fast, p_du_slow                # tendencies 
    99105    cdef dbl_ptr p_dPhi_fast, p_dPhi_slow, p_dW_fast, p_dW_slow                # tendencies 
    100106    # allocated arrays, must remain referenced or segfault 
    101     cdef readonly np.ndarray mass, theta_rhodz, u, geopot, w 
     107    cdef readonly np.ndarray mass, theta_rhodz, u, geopot, W 
    102108    cdef readonly np.ndarray mass_col, dmass_col, ps, theta, pk, hflux, qv 
    103109    cdef readonly np.ndarray drhodz, dtheta_rhodz, du_fast, du_slow 
    104110    cdef readonly np.ndarray dPhi_fast, dPhi_slow, dW_fast, dW_slow 
    105111 
    106     def __init__(self,mesh,time_scheme): 
     112    def __init__(self,mesh,time_scheme, nstep): 
     113        self.nstep=nstep 
    107114        #        self.mesh=mesh 
    108115        fps, ftheta, fmass = mesh.field_ps, mesh.field_theta, mesh.field_mass 
     
    113120        cdef double[:,:] cflj_ = time_scheme.cfjl 
    114121        ns = time_scheme.nstage 
    115         nb_stage[0]= ns 
     122        nb_stage[0]=ns 
     123 
    116124        cdef int i,j 
    117125        for i in range(ns): 
     
    123131        #    prognostic/diagnostic 
    124132        self.ps                       = alloc(&self.p_ps, fps)  
    125         self.mass_col, self.dmass_col = alloc(&self.p_mass_col, fps), alloc(&self.p_dmass_col, fps),  
     133        self.mass_col, self.dmass_col = alloc(&self.p_mass_col, fps), alloc(&self.p_dmass_col, fps,ns),  
    126134        self.mass, self.theta_rhodz   = alloc(&self.p_mass, fmass), alloc(&self.p_theta_rhodz, fmass), 
    127135        self.theta, self.pk           = alloc(&self.p_theta, fmass), alloc(&self.p_pk, fmass),  
    128         self.geopot, self.w           = alloc(&self.p_geopot, fw), alloc(&self.p_w, fw), 
     136        self.geopot, self.W           = alloc(&self.p_geopot, fw), alloc(&self.p_W, fw), 
    129137        self.hflux, self.u            = alloc(&self.p_hflux, fu), alloc(&self.p_u, fu)  
    130138        self.qv                       = alloc(&self.p_qv,fz) 
     
    137145        #        global elapsed 
    138146        # time1=time.time() 
    139         check_ptr('mass', self.p_mass, self.mass) 
    140         check_ptr('u', self.p_u, self.u) 
    141         dynamico_ARK_step(self.p_mass_col, self.p_mass, self.p_theta_rhodz, 
    142                           self.p_u, self.p_geopot, self.p_w, 
     147        dynamico_ARK_step(self.nstep, 
     148                          self.p_mass_col, self.p_mass, self.p_theta_rhodz, 
     149                          self.p_u, self.p_geopot, self.p_W, 
    143150                          self.p_theta, self.p_ps, self.p_pk, self.p_hflux, self.p_qv, 
    144151                          self.p_dmass_col, self.p_drhodz, self.p_dtheta_rhodz, 
     
    148155        #time2=time.time() 
    149156        #if time2>time1: elapsed=elapsed+time2-time1 
    150     def setup_TRSW(self): 
    151         setvars(('hydrostatic','caldyn_thermo','caldyn_eta'), 
    152                 (True,thermo_boussinesq,eta_lag)) 
    153         dynamico_init_params() 
    154     def setup_HPE(self, caldyn_thermo, caldyn_eta, g, BC,thermo): 
    155         setvars(('hydrostatic','caldyn_thermo','caldyn_eta', 
    156                  'g','ptop','Rd','cpp','preff','Treff'), 
    157                 (True,caldyn_thermo,caldyn_eta, 
    158                  g,BC.ptop,thermo.Rd,thermo.Cpd,thermo.p0,thermo.T0)) 
    159         dynamico_init_params() 
    160     def setup_NH(self, caldyn_thermo, caldyn_eta, g, BC,thermo): 
    161         setvars(('hydrostatic','caldyn_thermo','caldyn_eta', 
    162                  'g','ptop','Rd','cpp','preff','Treff', 
    163                  'pbot','rho_bot'), 
    164                 (False,caldyn_thermo,caldyn_eta, 
    165                  g,BC.ptop,thermo.Rd,thermo.Cpd,thermo.p0,thermo.T0, 
    166                  BC.pbot.max(), BC.rho_bot.max())) 
    167         dynamico_init_params() 
    168  
     157 
     158def caldyn_step_TRSW(mesh,time_scheme,nstep): 
     159    setvars(('hydrostatic','caldyn_thermo','caldyn_eta'), 
     160            (True,thermo_boussinesq,eta_lag)) 
     161    dynamico_init_params() 
     162    return Caldyn_step(mesh,time_scheme, nstep) 
     163def caldyn_step_HPE(mesh,time_scheme,nstep, caldyn_thermo,caldyn_eta, thermo,BC,g): 
     164    setvars(('hydrostatic','caldyn_thermo','caldyn_eta', 
     165             'g','ptop','Rd','cpp','preff','Treff'), 
     166             (True,caldyn_thermo,caldyn_eta, 
     167              g,BC.ptop,thermo.Rd,thermo.Cpd,thermo.p0,thermo.T0)) 
     168    dynamico_init_params() 
     169    return Caldyn_step(mesh,time_scheme, nstep) 
     170def caldyn_step_NH(mesh,time_scheme,nstep, caldyn_thermo, caldyn_eta, thermo,BC,g): 
     171    setvars(('hydrostatic','caldyn_thermo','caldyn_eta', 
     172             'g','ptop','Rd','cpp','preff','Treff','pbot','rho_bot'), 
     173             (False,caldyn_thermo,caldyn_eta, 
     174              g,BC.ptop,thermo.Rd,thermo.Cpd,thermo.p0,thermo.T0, 
     175              BC.pbot.max(), BC.rho_bot.max())) 
     176    dynamico_init_params() 
     177    return Caldyn_step(mesh,time_scheme, nstep) 
     178     
    169179#----------------------------- Base class for dynamics ------------------------ 
    170180 
     
    212222 
    213223class Caldyn_HPE(Caldyn): 
    214     def __init__(self,caldyn_thermo,caldyn_eta, mesh,metric,thermo,BC,g): 
     224    def __init__(self,caldyn_thermo,caldyn_eta, mesh,thermo,BC,g): 
    215225        Caldyn.__init__(self,mesh) 
    216226        setvars(('hydrostatic','caldyn_thermo','caldyn_eta', 
     
    231241 
    232242class Caldyn_NH(Caldyn): 
    233     def __init__(self,caldyn_thermo,caldyn_eta, mesh,metric,thermo,BC,g): 
     243    def __init__(self,caldyn_thermo,caldyn_eta, mesh,thermo,BC,g): 
    234244        Caldyn.__init__(self,mesh) 
    235245        setvars(('hydrostatic','caldyn_thermo','caldyn_eta', 
Note: See TracChangeset for help on using the changeset viewer.