3 changed files with 126 additions and 200 deletions
@ -1,120 +0,0 @@
|
||||
#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…
Reference in new issue