9 #ifndef OOPS_INTERFACE_MODEL_H_ 10 #define OOPS_INTERFACE_MODEL_H_ 14 #include <boost/noncopyable.hpp> 20 #include "oops/util/Duration.h" 21 #include "oops/util/Logger.h" 22 #include "oops/util/Printable.h" 23 #include "oops/util/Timer.h" 35 template <
typename MODEL>
36 class Model :
public util::Printable,
37 private boost::noncopyable,
38 private util::ObjectCounter<Model<MODEL> > {
45 static const std::string
classname() {
return "oops::Model";}
62 void print(std::ostream &)
const;
64 boost::scoped_ptr<ModelBase_>
model_;
69 template<
typename MODEL>
73 Log::trace() <<
"Model<MODEL>::Model starting" << std::endl;
77 Log::trace() <<
"Model<MODEL>::Model done" << std::endl;
82 template<
typename MODEL>
84 Log::trace() <<
"Model<MODEL>::~Model starting" << std::endl;
85 util::Timer timer(classname(),
"~Model");
87 Log::trace() <<
"Model<MODEL>::~Model done" << std::endl;
94 template<
typename MODEL>
96 const util::Duration &
len,
98 Log::trace() <<
"Model<MODEL>::forecast starting" << std::endl;
99 util::Timer timer(classname(),
"forecast");
102 Log::info() <<
"Model:forecast: forecast starting: " << xx << std::endl;
107 this->
step(xx, maux);
112 Log::info() <<
"Model:forecast: forecast finished: " << xx << std::endl;
115 Log::trace() <<
"Model<MODEL>::forecast done" << std::endl;
122 template<
typename MODEL>
124 Log::trace() <<
"Model<MODEL>::initialize starting" << std::endl;
125 util::Timer timer(classname(),
"initialize");
126 model_->initialize(xx);
127 Log::trace() <<
"Model<MODEL>::initialize done" << std::endl;
132 template<
typename MODEL>
134 Log::trace() <<
"Model<MODEL>::step starting" << std::endl;
135 util::Timer timer(classname(),
"step");
136 model_->step(xx, maux);
137 Log::trace() <<
"Model<MODEL>::step done" << std::endl;
142 template<
typename MODEL>
144 Log::trace() <<
"Model<MODEL>::finalize starting" << std::endl;
145 util::Timer timer(classname(),
"finalize");
146 model_->finalize(xx);
147 Log::trace() <<
"Model<MODEL>::finalize done" << std::endl;
152 template<
typename MODEL>
154 Log::trace() <<
"Model<MODEL>::print starting" << std::endl;
155 util::Timer timer(classname(),
"print");
157 Log::trace() <<
"Model<MODEL>::print done" << std::endl;
164 #endif // OOPS_INTERFACE_MODEL_H_ subroutine finalize(self)
void forecast(State_ &, const ModelAux_ &, const util::Duration &, PostProcessor< State_ > &) const
static const std::string classname()
************************************************************************GNU Lesser General Public License **This file is part of the GFDL Flexible Modeling System(FMS). ! *! *FMS is free software without even the implied warranty of MERCHANTABILITY or *FITNESS FOR A PARTICULAR PURPOSE See the GNU General Public License *for more details **You should have received a copy of the GNU Lesser General Public *License along with FMS If see< http:! ***********************************************************************!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !! MPP_TRANSMIT !! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! subroutine MPP_TRANSMIT_(put_data, put_len, to_pe, get_data, get_len, from_pe, block, tag, recv_request, send_request)!a message-passing routine intended to be reminiscent equally of both MPI and SHMEM!put_data and get_data are contiguous MPP_TYPE_ arrays!at each call, your put_data array is put to to_pe 's get_data! your get_data array is got from from_pe 's put_data!i.e we assume that typically(e.g updating halo regions) each PE performs a put _and_ a get!special PE designations:! NULL_PE:to disable a put or a get(e.g at boundaries)! ANY_PE:if remote PE for the put or get is to be unspecific! ALL_PES:broadcast and collect operations(collect not yet implemented)!ideally we would not pass length, but this f77-style call performs better(arrays passed by address, not descriptor)!further, this permits< length > contiguous words from an array of any rank to be passed(avoiding f90 rank conformance check)!caller is responsible for completion checks(mpp_sync_self) before and after integer, intent(in) ::put_len, to_pe, get_len, from_pe MPP_TYPE_, intent(in) ::put_data(*) MPP_TYPE_, intent(out) ::get_data(*) logical, intent(in), optional ::block integer, intent(in), optional ::tag integer, intent(out), optional ::recv_request, send_request logical ::block_comm integer ::i MPP_TYPE_, allocatable, save ::local_data(:) !local copy used by non-parallel code(no SHMEM or MPI) integer ::comm_tag integer ::rsize if(.NOT.module_is_initialized) call mpp_error(FATAL, 'MPP_TRANSMIT:You must first call mpp_init.') if(to_pe.EQ.NULL_PE .AND. from_pe.EQ.NULL_PE) return block_comm=.true. if(PRESENT(block)) block_comm=block if(debug) then call SYSTEM_CLOCK(tick) write(stdout_unit,'(a, i18, a, i6, a, 2i6, 2i8)')&'T=', tick, ' PE=', pe, ' MPP_TRANSMIT begin:to_pe, from_pe, put_len, get_len=', to_pe, from_pe, put_len, get_len end if comm_tag=DEFAULT_TAG if(present(tag)) comm_tag=tag!do put first and then get if(to_pe.GE.0 .AND. to_pe.LT.npes) then!use non-blocking sends if(debug .and.(current_clock.NE.0)) call SYSTEM_CLOCK(start_tick)!z1l:truly non-blocking send.! if(request(to_pe).NE.MPI_REQUEST_NULL) then !only one message from pe-> to_pe in queue *PE waiting for to_pe ! call error else get_len so only do gets but you cannot have a pure get with MPI call a get means do a wait to ensure put on remote PE is complete error call increase mpp_nml request_multiply call MPP_TRANSMIT end
ModelBase< MODEL > ModelBase_
Model(const Geometry_ &, const eckit::Configuration &)
Encapsulates the model state.
void initialize(State_ &) const
The namespace for the main oops code.
Geometry< MODEL > Geometry_
subroutine, private initialize
subroutine, public info(self)
void finalize(const FLDS &xx)
void process(const FLDS &xx)
Encapsulates the nonlinear forecast model.
const util::Duration & timeResolution() const
subroutine, public step(x, g)
boost::scoped_ptr< ModelBase_ > model_
ModelAuxControl< MODEL > ModelAux_
Control model post processing.
void finalize(State_ &) const
Base class for encapsulation of the forecast model.
const oops::Variables & variables() const
void print(std::ostream &) const
void initialize(const FLDS &xx, const util::DateTime &end, const util::Duration &step)
void step(State_ &, const ModelAux_ &) const
const util::DateTime validTime() const
Time.