Browse Source

New action using new Adapter interface

master
Michael Uleysky 4 weeks ago
parent
commit
fed984efcb
  1. 120
      actions/actiontscalt.h

120
actions/actiontscalt.h

@ -0,0 +1,120 @@
#pragma once
#include "Adapter.h"
#include "BFileW.h"
#include "actiondep.h"
#include "ncfilew.h"
#include "ncfuncs.h"
#include <memory>
using michlib::BFileW;
template<class T>
concept AdapterSupported = requires(T t, const CLArgs& args, michlib_internal::ParameterListEx& pars) {
{ t.GetAdapter(args, pars) } -> std::convertible_to<RetVal<Adapter>>;
};
ADD_ACTION(TSCA, tsca, AdapterSupported<Source>);
template<class D> MString ActionTSCA::DoAction(const CLArgs& args, D& ds)
{
michlib_internal::ParameterListEx pars;
pars.UsePrefix("");
pars.SetParameter("source", args.at("source"));
pars.SetParameter("history", args.at("_cmdline"));
Adapter ad;
{
auto ret = ds.GetAdapter(args, pars);
if(!ret) return "Error opening source";
ad = std::move(ret.Value());
}
MString name = args.contains("out") ? args.at("out") : "out.nc";
int compress = args.contains("compress") ? args.at("compress").ToInt() : 3;
MString varstring;
if(args.contains("var"))
varstring = args.at("var");
else
{
if(args.contains("vars"))
varstring = args.at("vars");
else
{
if constexpr(HasDefVars<D>)
varstring = ds.DefaultVars();
else
return "Variables not specified";
}
}
std::set<MString> vars;
{
auto vlist = michlib::Split_on_words(varstring, " ,", false);
for(const auto& vname: vlist)
{
if(vars.contains(vname)) return "Duplicate variable " + vname + " in list " + varstring;
if(!ad.Vars().contains(vname)) return "Variable " + vname + " does'nt supported by this dataset";
vars.insert(vname);
}
}
// Delete unused variables
ad.CleanVariables(vars);
pars.SetParameter("variables", varstring);
NCFileW ncfw;
{
auto ret = ncfw.Create(name, ad, pars, compress);
if(!ret) return "Can't create file " + name;
}
/*
michlib::message(ad.Title());
michlib::message("2D variables");
for(const auto& v: ad.Vars())
{
if(!ad.Is2D(v.first)) continue;
michlib::message(v.first, " --- ", v.second.info.lname);
michlib::message(" Internal name: ", v.second.info.name);
michlib::message(" Standard name: ", v.second.info.stname);
michlib::message(" Units: internal - ", v.second.info.unit, ", target - ", v.second.info.targetunit);
}
michlib::message("3D variables");
for(const auto& v: ad.Vars())
{
if(!ad.Is3D(v.first)) continue;
michlib::message(v.first, " --- ", v.second.info.lname);
michlib::message(" Internal name: ", v.second.info.name);
michlib::message(" Standard name: ", v.second.info.stname);
michlib::message(" Units: internal - ", v.second.info.unit, ", target - ", v.second.info.targetunit);
}
*/
const auto& ind = ad.TimeIndexes();
for(size_t it = 0; it < ind.size(); it++)
{
michlib::message(ad.Times()[ind[it]].ToTString());
for(const auto& v: ad.Vars())
if(ad.Is2D(v.first))
{
auto data = ad.Read2D(v.first, ind[it]);
if(!data) return "Can't read data";
auto ret = ncfw.WriteVariable(v.first, *data.Value(), it);
if(!ret) return "Can't write data";
}
else
{
auto data = ad.Read3D(v.first, ind[it]);
if(!data) return "Can't read data";
auto ret = ncfw.WriteVariable(v.first, *data.Value(), it);
if(!ret) return "Can't write data";
}
}
return "";
}
Loading…
Cancel
Save