tLingleClark.hh - pism - [fork] customized build of PISM, the parallel ice sheet model (tillflux branch)
 (HTM) git clone git://src.adamsgaard.dk/pism
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
       tLingleClark.hh (3668B)
       ---
            1 /* Copyright (C) 2013, 2014, 2015, 2016, 2017, 2018, 2019 PISM Authors
            2  *
            3  * This file is part of PISM.
            4  *
            5  * PISM is free software; you can redistribute it and/or modify it under the
            6  * terms of the GNU General Public License as published by the Free Software
            7  * Foundation; either version 3 of the License, or (at your option) any later
            8  * version.
            9  *
           10  * PISM is distributed in the hope that it will be useful, but WITHOUT ANY
           11  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
           12  * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
           13  * details.
           14  *
           15  * You should have received a copy of the GNU General Public License
           16  * along with PISM; if not, write to the Free Software
           17  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
           18 */
           19 
           20 #ifndef _PBLINGLECLARK_H_
           21 #define _PBLINGLECLARK_H_
           22 
           23 #include <memory>               // std::unique_ptr
           24 
           25 #include "BedDef.hh"
           26 
           27 namespace pism {
           28 namespace bed {
           29 
           30 class LingleClarkSerial;
           31 
           32 //! A wrapper class around LingleClarkSerial.
           33 class LingleClark : public BedDef {
           34 public:
           35   LingleClark(IceGrid::ConstPtr g);
           36   virtual ~LingleClark();
           37 
           38   const IceModelVec2S& total_displacement() const;
           39 
           40   const IceModelVec2S& viscous_displacement() const;
           41 
           42   const IceModelVec2S& elastic_displacement() const;
           43 
           44   const IceModelVec2S& relief() const;
           45 
           46   void step(const IceModelVec2S &ice_thickness,
           47             const IceModelVec2S &sea_level_elevation,
           48             double dt);
           49 
           50   IceModelVec2S::Ptr elastic_load_response_matrix() const;
           51 protected:
           52   virtual void define_model_state_impl(const File &output) const;
           53   virtual void write_model_state_impl(const File &output) const;
           54 
           55   DiagnosticList diagnostics_impl() const;
           56 
           57   MaxTimestep max_timestep_impl(double t) const;
           58   void init_impl(const InputOptions &opts, const IceModelVec2S &ice_thickness,
           59                  const IceModelVec2S &sea_level_elevation);
           60   void bootstrap_impl(const IceModelVec2S &bed_elevation,
           61                       const IceModelVec2S &bed_uplift,
           62                       const IceModelVec2S &ice_thickness,
           63                       const IceModelVec2S &sea_level_elevation);
           64   void update_impl(const IceModelVec2S &ice_thickness,
           65                    const IceModelVec2S &sea_level_elevation,
           66                    double t, double dt);
           67 
           68   //! Total (viscous and elastic) bed displacement.
           69   IceModelVec2S m_total_displacement;
           70 
           71   //! Storage on rank zero. Used to pass the load to the serial deformation model and get
           72   //! bed displacement back.
           73   petsc::Vec::Ptr m_work0;
           74 
           75   //! Bed relief relative to the bed displacement.
           76   IceModelVec2S m_relief;
           77 
           78   //! Ice-equivalent load thickness.
           79   IceModelVec2S m_load_thickness;
           80 
           81   //! Serial viscoelastic bed deformation model.
           82   std::unique_ptr<LingleClarkSerial> m_serial_model;
           83 
           84   //! extended grid for the viscous plate displacement
           85   IceGrid::Ptr m_extended_grid;
           86 
           87   //! Viscous displacement on the extended grid (part of the model state).
           88   IceModelVec2S m_viscous_displacement;
           89   //! rank 0 storage using the extended grid
           90   petsc::Vec::Ptr m_viscous_displacement0;
           91 
           92   //! Elastic bed displacement (part of the model state)
           93   IceModelVec2S m_elastic_displacement;
           94   //! rank 0 storage for the elastic displacement
           95   petsc::Vec::Ptr m_elastic_displacement0;
           96 
           97   //! time of the last bed deformation update
           98   double m_t_last;
           99   //! Update interval in seconds
          100   double m_update_interval;
          101   //! Temporal resolution to use when checking whether it's time to update
          102   double m_t_eps;
          103   //! Name of the variable used to store the last update time.
          104   std::string m_time_name;
          105 };
          106 
          107 } // end of namespace bed
          108 } // end of namespace pism
          109 
          110 #endif /* _PBLINGLECLARK_H_ */