37 using std::ostringstream;
38 using std::istringstream;
40 #include "FONcRequestHandler.h"
42 #include "FONcTransform.h"
43 #include "FONcUtils.h"
44 #include "FONcBaseType.h"
45 #include "FONcAttributes.h"
50 #include <D4Attributes.h>
51 #include <Structure.h>
56 #include <BESInternalError.h>
58 #include "DapFunctionUtils.h"
75 string s = (string)
"File out netcdf, " +
"null DDS passed to constructor";
78 if (localfile.empty()) {
79 string s = (string)
"File out netcdf, " +
"empty local file name passed to constructor";
82 _localfile = localfile;
84 _returnAs = ncVersion;
115 string s = (string)
"File out netcdf, " +
"null DDS passed to constructor";
118 if (localfile.empty()) {
119 string s = (string)
"File out netcdf, " +
"empty local file name passed to constructor";
122 _localfile = localfile;
124 _returnAs = ncVersion;
150 vector<FONcBaseType *>::iterator i = _fonc_vars.begin();
151 vector<FONcBaseType *>::iterator e = _fonc_vars.end();
164 vector<FONcBaseType *>::iterator i = _total_fonc_vars_in_grp.begin();
165 vector<FONcBaseType *>::iterator e = _total_fonc_vars_in_grp.end();
173 _total_fonc_vars_in_grp.erase(i);
195 DDS::Vars_iter vi = _dds->var_begin();
196 DDS::Vars_iter ve = _dds->var_end();
197 for (; vi != ve; vi++) {
198 if ((*vi)->send_p()) {
201 BESDEBUG(
"fonc",
"FONcTransform::transform() - Converting variable '" << v->name() <<
"'" << endl);
207 if ( FONcTransform::_returnAs == RETURNAS_NETCDF4 ) {
208 if (FONcRequestHandler::classic_model)
214 _fonc_vars.push_back(fb);
216 vector<string> embed;
223 if ( FONcTransform::_returnAs == RETURNAS_NETCDF4 ) {
224 if (FONcRequestHandler::classic_model){
225 BESDEBUG(
"fonc",
"FONcTransform::transform() - Opening NetCDF-4 cache file in classic mode. fileName: " << _localfile << endl);
226 stax = nc_create(_localfile.c_str(), NC_CLOBBER|NC_NETCDF4|NC_CLASSIC_MODEL, &_ncid);
229 BESDEBUG(
"fonc",
"FONcTransform::transform() - Opening NetCDF-4 cache file. fileName: " << _localfile << endl);
230 stax = nc_create(_localfile.c_str(), NC_CLOBBER|NC_NETCDF4, &_ncid);
234 BESDEBUG(
"fonc",
"FONcTransform::transform() - Opening NetCDF-3 cache file. fileName: " << _localfile << endl);
235 stax = nc_create(_localfile.c_str(), NC_CLOBBER, &_ncid);
238 if (stax != NC_NOERR) {
250 vector<FONcBaseType *>::iterator i = _fonc_vars.begin();
251 vector<FONcBaseType *>::iterator e = _fonc_vars.end();
252 for (; i != e; i++) {
254 BESDEBUG(
"fonc",
"FONcTransform::transform() - Defining variable: " << fbt->name() << endl);
258 if(FONcRequestHandler::no_global_attrs ==
false) {
260 AttrTable &globals = _dds->get_attr_table();
261 BESDEBUG(
"fonc",
"FONcTransform::transform() - Adding Global Attributes" << endl << globals << endl);
262 bool is_netCDF_enhanced =
false;
263 if(FONcTransform::_returnAs == RETURNAS_NETCDF4 && FONcRequestHandler::classic_model==
false)
264 is_netCDF_enhanced =
true;
270 int stax = nc_enddef(_ncid);
274 if (stax != NC_NOERR) {
275 FONcUtils::handle_error(stax,
"File out netcdf, unable to end the define mode: " + _localfile, __FILE__, __LINE__);
279 i = _fonc_vars.begin();
280 e = _fonc_vars.end();
281 for (; i != e; i++) {
283 BESDEBUG(
"fonc",
"FONcTransform::transform() - Writing data for variable: " << fbt->name() << endl);
287 stax = nc_close(_ncid);
288 if (stax != NC_NOERR)
292 (void) nc_close(_ncid);
314 BESDEBUG(
"fonc",
"Coming into transform_dap4() "<< endl);
317 bool support_group = check_group_support();
319 if(
true == support_group) {
322 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4() - Opening NetCDF-4 cache file. fileName: " << _localfile << endl);
323 stax = nc_create(_localfile.c_str(), NC_CLOBBER|NC_NETCDF4, &_ncid);
324 if (stax != NC_NOERR)
327 D4Group* root_grp = _dmr->root();
330 map<string,int>fdimname_to_id;
334 gen_included_grp_list(root_grp);
336 for (std::set<string>::iterator it=_included_grp_names.begin(); it!=_included_grp_names.end(); ++it)
337 BESDEBUG(
"fonc",
"included group list name is: "<<*it<<endl);
341 check_and_obtain_dimensions(root_grp,
true);
345 map<string,unsigned long>:: iterator it;
347 for(it=GFQN_dimname_to_dimsize.begin();it!=GFQN_dimname_to_dimsize.end();++it) {
348 BESDEBUG(
"fonc",
"Final GFQN dim name is: "<<it->first<<endl);
349 BESDEBUG(
"fonc",
"Final GFQN dim size is: "<<it->second<<endl);
352 for(it=VFQN_dimname_to_dimsize.begin();it!=VFQN_dimname_to_dimsize.end();++it) {
353 BESDEBUG(
"fonc",
"Final VFQN dim name is: "<<it->first<<endl);
354 BESDEBUG(
"fonc",
"Final VFQN dim size is: "<<it->second<<endl);
362 map<string,unsigned long>:: iterator git,vit;
363 for(git=GFQN_dimname_to_dimsize.begin();git!=GFQN_dimname_to_dimsize.end();++git) {
364 for(vit=VFQN_dimname_to_dimsize.begin();vit!=VFQN_dimname_to_dimsize.end();++vit) {
365 if(git->first == vit->first) {
366 if(git->second != vit->second)
367 git->second = vit->second;
383 vector<string> root_d4_dimname_list;
384 for(git=GFQN_dimname_to_dimsize.begin();git!=GFQN_dimname_to_dimsize.end();++git) {
385 string d4_temp_dimname = git->first.substr(1);
387 if(d4_temp_dimname.find(
'/')==string::npos)
388 root_d4_dimname_list.push_back(d4_temp_dimname);
392 for(
unsigned int i = 0; i <root_d4_dimname_list.size();i++)
393 BESDEBUG(
"fonc",
"root_d4 dim name is: "<<root_d4_dimname_list[i]<<endl);
397 vector<int> root_dim_suffix_nums;
398 for(
unsigned int i = 0; i <root_d4_dimname_list.size();i++){
399 if(root_d4_dimname_list[i].size()<4)
401 else if(root_d4_dimname_list[i].substr(0,3)!=
"dim")
404 string temp_suffix = root_d4_dimname_list[i].substr(3);
406 bool ignored_suffix =
false;
407 for (
unsigned int j = 0; j<temp_suffix.size();j++) {
408 if(!isdigit(temp_suffix[j])) {
409 ignored_suffix =
true;
413 if(ignored_suffix==
true)
416 root_dim_suffix_nums.push_back(atoi(temp_suffix.c_str()));
421 for(
unsigned int i = 0; i <root_dim_suffix_nums.size();i++)
422 BESDEBUG(
"fonc",
"root_dim_suffix_nums: "<<root_dim_suffix_nums[i]<<endl);
425 for(it=GFQN_dimname_to_dimsize.begin();it!=GFQN_dimname_to_dimsize.end();++it) {
426 BESDEBUG(
"fonc",
"RFinal GFQN dim name is: "<<it->first<<endl);
427 BESDEBUG(
"fonc",
"RFinal GFQN dim size is: "<<it->second<<endl);
430 for(it=VFQN_dimname_to_dimsize.begin();it!=VFQN_dimname_to_dimsize.end();++it) {
431 BESDEBUG(
"fonc",
"RFinal VFQN dim name is: "<<it->first<<endl);
432 BESDEBUG(
"fonc",
"RFinal VFQN dim size is: "<<it->second<<endl);
437 transform_dap4_group(root_grp,
true,_ncid,fdimname_to_id,root_dim_suffix_nums);
438 stax = nc_close(_ncid);
439 if (stax != NC_NOERR)
444 transform_dap4_no_group();
453 void FONcTransform::transform_dap4_no_group() {
455 D4Group* root_grp = _dmr->root();
458 D4Dimensions *root_dims = root_grp->dims();
459 for(D4Dimensions::D4DimensionsIter di = root_dims->dim_begin(), de = root_dims->dim_end(); di != de; ++di) {
460 BESDEBUG(
"fonc",
"transform_dap4() - check dimensions"<< endl);
461 BESDEBUG(
"fonc",
"transform_dap4() - dim name is: "<<(*di)->name()<<endl);
462 BESDEBUG(
"fonc",
"transform_dap4() - dim size is: "<<(*di)->size()<<endl);
463 BESDEBUG(
"fonc",
"transform_dap4() - fully_qualfied_dim name is: "<<(*di)->fully_qualified_name()<<endl);
468 Constructor::Vars_iter vi = root_grp->var_begin();
469 Constructor::Vars_iter ve = root_grp->var_end();
471 for (; vi != ve; vi++) {
472 if ((*vi)->send_p()) {
475 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4_no_group() - Converting variable '" << v->name() <<
"'" << endl);
479 _fonc_vars.push_back(fb);
481 vector<string> embed;
487 if(root_grp->grp_begin() == root_grp->grp_end())
488 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4() - No group " << endl);
490 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4() - has group " << endl);
491 for (D4Group::groupsIter gi = root_grp->grp_begin(), ge = root_grp->grp_end(); gi != ge; ++gi)
492 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4() - group name: " << (*gi)->name() << endl);
497 if ( FONcTransform::_returnAs == RETURNAS_NETCDF4 ) {
498 if (FONcRequestHandler::classic_model){
499 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4_no_group() - Opening NetCDF-4 cache file in classic mode. fileName: " << _localfile << endl);
500 stax = nc_create(_localfile.c_str(), NC_CLOBBER|NC_NETCDF4|NC_CLASSIC_MODEL, &_ncid);
503 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4_no_group() - Opening NetCDF-4 cache file. fileName: " << _localfile << endl);
504 stax = nc_create(_localfile.c_str(), NC_CLOBBER|NC_NETCDF4, &_ncid);
508 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4_no_group() - Opening NetCDF-3 cache file. fileName: " << _localfile << endl);
509 stax = nc_create(_localfile.c_str(), NC_CLOBBER, &_ncid);
512 if (stax != NC_NOERR) {
524 vector<FONcBaseType *>::iterator i = _fonc_vars.begin();
525 vector<FONcBaseType *>::iterator e = _fonc_vars.end();
526 for (; i != e; i++) {
528 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4_no_group() - Defining variable: " << fbt->name() << endl);
529 fbt->set_is_dap4(
true);
533 if(FONcRequestHandler::no_global_attrs ==
false) {
536 D4Group* root_grp=_dmr->root();
537 D4Attributes*d4_attrs = root_grp->attributes();
539 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4_no_group() handle GLOBAL DAP4 attributes "<< d4_attrs <<endl);
541 for (D4Attributes::D4AttributesIter ii = d4_attrs->attribute_begin(), ee = d4_attrs->attribute_end(); ii != ee; ++ii) {
542 string name = (*ii)->name();
543 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4() GLOBAL attribute name is "<<name <<endl);
546 bool is_netCDF_enhanced =
false;
547 if(FONcTransform::_returnAs == RETURNAS_NETCDF4 && FONcRequestHandler::classic_model==
false)
548 is_netCDF_enhanced =
true;
554 int stax = nc_enddef(_ncid);
558 if (stax != NC_NOERR) {
559 FONcUtils::handle_error(stax,
"File out netcdf, unable to end the define mode: " + _localfile, __FILE__, __LINE__);
563 i = _fonc_vars.begin();
564 e = _fonc_vars.end();
565 for (; i != e; i++) {
567 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4_no_group() - Writing data for variable: " << fbt->name() << endl);
571 stax = nc_close(_ncid);
572 if (stax != NC_NOERR)
576 (void) nc_close(_ncid);
583 void FONcTransform::transform_dap4_group(D4Group* grp,
585 int par_grp_id,map<string,int>&fdimname_to_id,
586 vector<int>&root_dim_suffix_nums ) {
588 bool included_grp =
false;
591 if(is_root_grp ==
true)
595 set<string>::iterator iset;
596 if(_included_grp_names.find(grp->FQN())!=_included_grp_names.end())
602 if(included_grp ==
true)
603 transform_dap4_group_internal(grp,is_root_grp,par_grp_id,fdimname_to_id,root_dim_suffix_nums);
608 void FONcTransform::transform_dap4_group_internal(D4Group* grp,
610 int par_grp_id,map<string,int>&fdimname_to_id,
611 vector<int>& rds_nums ) {
615 if(is_root_grp ==
true)
618 stax = nc_def_grp(par_grp_id,(*grp).name().c_str(),&grp_id);
619 if (stax != NC_NOERR)
624 D4Dimensions *grp_dims = grp->dims();
625 for(D4Dimensions::D4DimensionsIter di = grp_dims->dim_begin(), de = grp_dims->dim_end(); di != de; ++di) {
627 BESDEBUG(
"fonc",
"transform_dap4() - check dimensions"<< endl);
628 BESDEBUG(
"fonc",
"transform_dap4() - dim name is: "<<(*di)->name()<<endl);
629 BESDEBUG(
"fonc",
"transform_dap4() - dim size is: "<<(*di)->size()<<endl);
630 BESDEBUG(
"fonc",
"transform_dap4() - fully_qualfied_dim name is: "<<(*di)->fully_qualified_name()<<endl);
634 unsigned long dimsize = (*di)->size();
635 if((*di)->constrained()) {
636 dimsize = ((*di)->c_stop() -(*di)->c_start())/(*di)->c_stride() +1;
640 unsigned long dimsize =(*di)->size();
643 map<string,unsigned long>:: iterator it;
644 for(it=GFQN_dimname_to_dimsize.begin();it!=GFQN_dimname_to_dimsize.end();++it) {
645 if(it->first == (*di)->fully_qualified_name())
646 dimsize = it->second;
651 stax = nc_def_dim(grp_id,(*di)->name().c_str(),dimsize,&g_dimid);
652 if (stax != NC_NOERR)
653 FONcUtils::handle_error(stax,
"File out netcdf, unable to define dimension: " + _localfile, __FILE__, __LINE__);
655 fdimname_to_id[(*di)->fully_qualified_name()] = g_dimid;
658 Constructor::Vars_iter vi = grp->var_begin();
659 Constructor::Vars_iter ve = grp->var_end();
661 vector<FONcBaseType *> fonc_vars_in_grp;
662 for (; vi != ve; vi++) {
663 if ((*vi)->send_p()) {
666 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4_group() - Converting variable '" << v->name() <<
"'" << endl);
672 fonc_vars_in_grp.push_back(fb);
675 _total_fonc_vars_in_grp.push_back(fb);
677 vector<string> embed;
678 fb->convert(embed,
true);
683 if(grp->grp_begin() == grp->grp_end())
684 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4() - No group " << endl);
686 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4() - has group " << endl);
695 vector<FONcBaseType *>::iterator i = fonc_vars_in_grp.begin();
696 vector<FONcBaseType *>::iterator e = fonc_vars_in_grp.end();
697 for (; i != e; i++) {
699 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4_group() - Defining variable: " << fbt->name() << endl);
700 fbt->set_is_dap4(
true);
704 bool is_netCDF_enhanced =
false;
705 if(FONcTransform::_returnAs == RETURNAS_NETCDF4 && FONcRequestHandler::classic_model==
false)
706 is_netCDF_enhanced =
true;
709 bool add_attr =
true;
712 if(FONcRequestHandler::no_global_attrs ==
true && is_root_grp ==
true)
715 if(
true == add_attr) {
716 D4Attributes*d4_attrs = grp->attributes();
717 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4_group() - Adding Group Attributes" << endl) ;
723 i = fonc_vars_in_grp.begin();
724 e = fonc_vars_in_grp.end();
725 for (; i != e; i++) {
727 BESDEBUG(
"fonc",
"FONcTransform::transform() - Writing data for variable in group: " << fbt->name() << endl);
733 for (D4Group::groupsIter gi = grp->grp_begin(), ge = grp->grp_end(); gi != ge; ++gi) {
734 BESDEBUG(
"fonc",
"FONcTransform::transform_dap4() in group - group name: " << (*gi)->name() << endl);
735 transform_dap4_group(*gi,
false,grp_id,fdimname_to_id,rds_nums);
740 (void) nc_close(_ncid);
749 bool FONcTransform::check_group_support() {
750 if(RETURNAS_NETCDF4 == FONcTransform::_returnAs &&
false == FONcRequestHandler::classic_model &&
751 (_dmr->root()->grp_begin()!=_dmr->root()->grp_end()))
758 void FONcTransform::gen_included_grp_list(D4Group*grp)
760 bool grp_has_var =
false;
762 BESDEBUG(
"fnoc",
"<coming to the D4 group has name " << grp->name()<<endl);
763 BESDEBUG(
"fnoc",
"<coming to the D4 group has fullpath " << grp->FQN()<<endl);
765 if(grp->var_begin()!=grp->var_end()) {
767 BESDEBUG(
"fnoc",
"<has the vars " << endl);
768 Constructor::Vars_iter vi = grp->var_begin();
769 Constructor::Vars_iter ve = grp->var_end();
771 for (; vi != ve; vi++) {
774 if ((*vi)->send_p()) {
780 _included_grp_names.insert(grp->FQN());
786 for (D4Group::groupsIter gi = grp->grp_begin(), ge = grp->grp_end(); gi != ge; ++gi) {
787 BESDEBUG(
"fonc",
"obtain included groups - group name: " << (*gi)->name() << endl);
788 gen_included_grp_list(*gi);
793 if(grp_has_var ==
true) {
794 D4Group *temp_grp = grp;
796 if(temp_grp->get_parent()){
797 temp_grp =
static_cast<D4Group*
>(temp_grp->get_parent());
798 if(temp_grp->FQN()!=
"/")
799 _included_grp_names.insert(temp_grp->FQN());
808 void FONcTransform::check_and_obtain_dimensions(D4Group*grp,
bool is_root_grp) {
811 bool included_grp =
false;
813 if(is_root_grp ==
true)
817 set<string>::iterator iset;
818 if(_included_grp_names.find(grp->FQN())!=_included_grp_names.end())
822 if(included_grp ==
true)
823 check_and_obtain_dimensions_internal(grp);
826 void FONcTransform::check_and_obtain_dimensions_internal(D4Group*grp) {
829 D4Dimensions *grp_dims = grp->dims();
831 for(D4Dimensions::D4DimensionsIter di = grp_dims->dim_begin(), de = grp_dims->dim_end(); di != de; ++di) {
833 BESDEBUG(
"fonc",
"transform_dap4() - check dimensions"<< endl);
834 BESDEBUG(
"fonc",
"transform_dap4() - dim name is: "<<(*di)->name()<<endl);
835 BESDEBUG(
"fonc",
"transform_dap4() - dim size is: "<<(*di)->size()<<endl);
836 BESDEBUG(
"fonc",
"transform_dap4() - fully_qualfied_dim name is: "<<(*di)->fully_qualified_name()<<endl);
838 unsigned long dimsize = (*di)->size();
839 if((*di)->constrained()) {
840 dimsize = ((*di)->c_stop() -(*di)->c_start())/(*di)->c_stride() +1;
843 GFQN_dimname_to_dimsize[(*di)->fully_qualified_name()] = dimsize;
850 Constructor::Vars_iter vi = grp->var_begin();
851 Constructor::Vars_iter ve = grp->var_end();
852 for (; vi != ve; vi++) {
853 if ((*vi)->send_p()) {
854 if((*vi)->is_vector_type()) {
855 Array *t_a =
dynamic_cast<Array*
>(*vi);
856 Array::Dim_iter dim_i = t_a->dim_begin();
857 Array::Dim_iter dim_e = t_a->dim_end();
858 for(;dim_i !=dim_e;dim_i++) {
859 if((*dim_i).name!=
"") {
860 D4Dimension* d4dim = t_a->dimension_D4dim(dim_i);
862 BESDEBUG(
"fonc",
"transform_dap4() check dim- dim name is: "<<d4dim->name()<<endl);
863 BESDEBUG(
"fonc",
"transform_dap4() check dim- dim size is: "<<d4dim->size()<<endl);
864 BESDEBUG(
"fonc",
"transform_dap4() check dim- fully_qualfied_dim name is: "<<d4dim->fully_qualified_name()<<endl);
867 unsigned long dimsize = d4dim->size();
868 if(d4dim->constrained())
869 dimsize = (d4dim->c_stop() -d4dim->c_start())/d4dim->c_stride() +1;
870 BESDEBUG(
"fonc",
"transform_dap4() check dim- final dim size is: "<<d4dim->size()<<endl);
872 unsigned long dimsize = t_a->dimension_size(dim_i,
true);
873 pair<map<string,unsigned long>::iterator,
bool> ret_it;
874 ret_it = VFQN_dimname_to_dimsize.insert(pair<string,unsigned long>(d4dim->fully_qualified_name(),dimsize));
875 if(ret_it.second ==
false && ret_it.first->second!=dimsize) {
876 string err =
"fileout_netcdf-4: dimension found with the same name, but different size";
882 throw BESInternalError(
"Has dimension name but D4 dimension is NULL",__FILE__,__LINE__);
892 map<string,unsigned long>:: iterator it;
893 for(it=GFQN_dimname_to_dimsize.begin();it!=GFQN_dimname_to_dimsize.end();++it) {
894 BESDEBUG(
"fonc",
"GFQN dim name is: "<<it->first<<endl);
895 BESDEBUG(
"fonc",
"GFQN dim size is: "<<it->second<<endl);
898 for(it=VFQN_dimname_to_dimsize.begin();it!=VFQN_dimname_to_dimsize.end();++it) {
899 BESDEBUG(
"fonc",
"VFQN dim name is: "<<it->first<<endl);
900 BESDEBUG(
"fonc",
"VFQN dim size is: "<<it->second<<endl);
906 for (D4Group::groupsIter gi = grp->grp_begin(), ge = grp->grp_end(); gi != ge; ++gi) {
907 BESDEBUG(
"fonc",
"FONcTransform::check_and_obtain_dimensions() in group - group name: " << (*gi)->name() << endl);
908 check_and_obtain_dimensions(*gi,
false);
925 strm << BESIndent::LMarg <<
"FONcTransform::dump - (" << (
void *)
this <<
")" << endl;
927 strm << BESIndent::LMarg <<
"ncid = " << _ncid << endl;
928 strm << BESIndent::LMarg <<
"temporary file = " << _localfile << endl;
930 vector<FONcBaseType *>::const_iterator i = _fonc_vars.begin();
931 vector<FONcBaseType *>::const_iterator e = _fonc_vars.end();
932 for (; i != e; i++) {
936 BESIndent::UnIndent();
937 BESIndent::UnIndent();
std::string get_container_type() const
retrieve the type of data this container holds, such as cedar or netcdf.
Structure storing information used by the BES to handle the request.
void first_container()
set the container pointer to the first container in the containers list
BESContainer * container
pointer to current container in this interface
Abstract exception class for the BES with basic string message.
exception thrown if internal error encountered
static void add_dap4_attributes(int ncid, int varid, D4Attributes *d4_attrs, const string &var_name, const string &prepend_attr, bool is_netCDF_enhanced)
add_dap4_attributes
static void add_attributes(int ncid, int varid, AttrTable &attrs, const string &var_name, const string &prepend_attr, bool is_netCDF_enhanced)
helper function for add_attributes
A DAP BaseType with file out netcdf information included.
virtual void setVersion(std::string version)
Identifies variable with use of NetCDF4 features.
virtual void setNC4DataModel(std::string nc4_datamodel)
Identifies the netCDF4 data model (CLASSIC or ENHANCED)
virtual void define(int ncid)
Define the variable in the netcdf file.
virtual void dump(std::ostream &strm) const =0
dump the contents of this object to the specified ostream
static void handle_error(int stax, const string &err, const string &file, int line)
handle any netcdf errors
static string name_prefix
If a variable name, dimension name, or attribute name begins with a character that is not supported b...
static void reset()
Resets the FONc transformation for a new input and out file.
static FONcBaseType * convert(BaseType *v, const string &version, const bool classic_model)
Creates a FONc object for the given DAP object.