yanera_xml_output.c

Go to the documentation of this file.
00001 /*==============================================================================
00002 Copyright 2006 Thad Harroun, Kevin Yager
00003 
00004 This file is part of "yanera 2.0".
00005 
00006 "yanera 2.0" is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version.
00007 
00008 "yanera 2.0" is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
00009 
00010 You should have received a copy of the GNU General Public License along with "yanera 2.0"; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA 
00011 ==============================================================================*/ 
00012 /*============================================================================*/
00019 #define _CRT_SECURE_NO_DEPRECATE
00020 
00021 #include "yanera.h"
00022 #include "yanera_xml_output.h"
00023 #include "yanera_xml_util.h"
00024 /*============================================================================*/
00025 void yanera_write_xml(yanera_container *yanera)
00026 {
00027   short             i, j, k, r;
00028   xmlDocPtr         xml_doc;
00029   xmlDtdPtr         xml_dtd;
00030   xmlNodePtr        xml_root;
00031   xmlNodePtr        xml_node;
00032   xmlNodePtr        xml_section;
00033   xmlNodePtr        xml_node_data;
00034   xmlNodePtr        xml_node_resolution;
00035   xmlNodePtr        xml_node_model;
00036   xmlNodePtr        xml_node_layer;
00037   xmlNodePtr        xml_node_repeat;
00038   xmlNodePtr        xml_comment;
00039   yanera_layer     *layer;
00040   char              buf[80];
00041   
00042   /*---------------------------------
00043    *  Output in format with indents for each child.
00044    */
00045   xmlThrDefIndentTreeOutput(1);
00046   
00047   /*---------------------------------
00048    *  New document
00049    */
00050   xml_doc = xmlNewDoc((unsigned char*)"1.0");
00051   if (xml_doc == NULL )
00052   { 
00053     yanera_error("XML output document not created successfully", \
00054                  __FILE__, __LINE__, yanera);
00055   }
00056   /*---------------------------------
00057    * <!DOCTYPE reflect SYSTEM "reflect.dtd">
00058    */
00059   xml_dtd = xmlCreateIntSubset(xml_doc, (unsigned char *)"yanera", \
00060                                NULL, (unsigned char *)"yanera.dtd");
00061   if (xml_dtd == NULL ) 
00062   {
00063     yanera_error("XML DTD not created successfully", \
00064                  __FILE__, __LINE__, yanera);
00065   }
00066   /*---------------------------------
00067    *  Root node : yanera
00068    */
00069   xml_root = xmlNewDocNode(xml_doc, NULL, (unsigned char*)"yanera", NULL);
00070   xmlDocSetRootElement(xml_doc, xml_root);
00071   xml_comment = xmlNewComment((const xmlChar *)\
00072   " ====================================================================== ");
00073   xmlAddChild(xml_root,xml_comment);
00074   
00075   /*---------------------------------
00076    * <miscellaneous_section/> node 
00077    */
00078   xml_section = xmlNewChild(xml_root, NULL, \
00079                             (unsigned char*)"miscellaneous_section", \
00080                             NULL);  
00081   /*---------------------------------
00082    * <write_results/> node 
00083    */
00084   memset(buf, '\0', 30);
00085   setYesNoBooleanFromString((char *)buf,yanera->misc.write_results);
00086   xml_node = xmlNewTextChild(xml_section, NULL,               \
00087                              (unsigned char*)"write_results", \
00088                              (unsigned char*)buf);
00089   /*---------------------------------
00090    * <write_profile/> node 
00091    */
00092   memset(buf, '\0', 30);
00093   setYesNoBooleanFromString((char *)buf,yanera->misc.write_profile);
00094   xml_node = xmlNewTextChild(xml_section, NULL,               \
00095                              (unsigned char*)"write_profile", \
00096                              (unsigned char*)buf);
00097   /*---------------------------------
00098    * <write_reflectivity/> node 
00099    */
00100   memset(buf, '\0', 30);
00101   setYesNoBooleanFromString((char *)buf,yanera->misc.write_reflectivity);
00102   xml_node = xmlNewTextChild(xml_section, NULL,                    \
00103                              (unsigned char*)"write_reflectivity", \
00104                              (unsigned char*)buf);
00105   /*---------------------------------
00106    * <write_slabs/> node 
00107    */
00108   memset(buf, '\0', 30);
00109   setYesNoBooleanFromString((char *)buf, yanera->misc.write_slabs);
00110   xml_node = xmlNewTextChild(xml_section, NULL,             \
00111                              (unsigned char*)"write_slabs", \
00112                              (unsigned char*)buf);
00113   /*---------------------------------
00114    * <q_min/> node 
00115    */
00116   memset(buf, '\0', 30);
00117   sprintf((char *)buf,"%g",yanera->misc.q_min);
00118   xml_node = xmlNewTextChild(xml_section, NULL,       \
00119                              (unsigned char*)"q_min", \
00120                              (unsigned char*)buf);
00121   /*---------------------------------
00122    * <q_max/> node 
00123    */
00124   memset(buf, '\0', 30);
00125   sprintf((char *)buf,"%g",yanera->misc.q_max);
00126   xml_node = xmlNewTextChild(xml_section, NULL,       \
00127                              (unsigned char*)"q_max", \
00128                              (unsigned char*)buf);
00129   /*---------------------------------
00130    * <q_num/> node 
00131    */
00132   memset(buf, '\0', 30);
00133   sprintf((char *)buf,"%hd",yanera->misc.q_num);
00134   xml_node = xmlNewTextChild(xml_section, NULL,       \
00135                              (unsigned char*)"q_num", \
00136                              (unsigned char*)buf);
00137   /*---------------------------------
00138    * <z_num/> node 
00139    */
00140   memset(buf, '\0', 30);
00141   sprintf((char *)buf,"%hd",yanera->misc.z_num);
00142   xml_node = xmlNewTextChild(xml_section, NULL,       \
00143                              (unsigned char*)"z_num", \
00144                              (unsigned char*)buf);
00145   /*---------------------------------
00146    * <quadrature_error/> node 
00147    */
00148   memset(buf, '\0', 30);
00149   sprintf((char *)buf,"%g",yanera->misc.quadrature_error);
00150   xml_node = xmlNewTextChild(xml_section, NULL,                  \
00151                              (unsigned char*)"quadrature_error", \
00152                              (unsigned char*)buf);
00153   /*---------------------------------
00154    * <quadrature_thik/> node 
00155    */
00156   memset(buf, '\0', 30);
00157   sprintf((char *)buf,"%g",yanera->misc.quadrature_thik);
00158   xml_node = xmlNewTextChild(xml_section, NULL,                  \
00159                              (unsigned char*)"quadrature_thik", \
00160                              (unsigned char*)buf);
00161   /*---------------------------------
00162    * <do_fit/> node 
00163    */
00164   memset(buf, '\0', 30);
00165   setYesNoBooleanFromString((char *)buf, yanera->misc.fit_do);
00166   xml_node = xmlNewTextChild(xml_section, NULL,        \
00167                              (unsigned char*)"fit_do", \
00168                              (unsigned char*)buf);
00169   /*---------------------------------
00170    * <fit_weighting/> node 
00171    */
00172   memset(buf, '\0', 30);
00173   switch (yanera->misc.fit_weighting) {
00174     case WEIGHT_NONE: 
00175       sprintf((char *)buf,"WEIGHT_NONE");
00176       break;
00177     case WEIGHT_R: 
00178       sprintf((char *)buf,"WEIGHT_R");
00179       break;
00180     case WEIGHT_SQRT: 
00181       sprintf((char *)buf,"WEIGHT_SQRT");
00182       break;
00183     case WEIGHT_DATA:
00184       sprintf((char *)buf,"WEIGHT_DATA");
00185       break;
00186     default: 
00187       break;
00188   }
00189   xml_node = xmlNewTextChild(xml_section, NULL,               \
00190                              (unsigned char*)"fit_weighting", \
00191                              (unsigned char*)buf);
00192                         
00193   /*---------------------------------
00194    * <fit_iterations/> node 
00195    */
00196   memset(buf, '\0', 30);
00197   sprintf((char *)buf,"%hd",yanera->misc.fit_iterations);
00198   xml_node = xmlNewTextChild(xml_section, NULL,       \
00199                              (unsigned char*)"fit_iterations", \
00200                              (unsigned char*)buf);
00201   /*---------------------------------
00202    * <fit_write_iterations/> node 
00203    */
00204   memset(buf, '\0', 30);
00205   sprintf((char *)buf,"%hd",yanera->misc.fit_write_iterations);
00206   xml_node = xmlNewTextChild(xml_section, NULL,       \
00207                              (unsigned char*)"fit_write_iterations", \
00208                              (unsigned char*)buf);
00209   /*---------------------------------
00210    * <fit_weighting/> node 
00211    */
00212   memset(buf, '\0', 30);
00213   switch (yanera->misc.fit_method) {
00214     case CONJUGATE_FR: 
00215       sprintf((char *)buf,"CONJUGATE_FR");
00216       break;
00217     case CONJUGATE_PR: 
00218       sprintf((char *)buf,"CONJUGATE_PR");
00219       break;
00220     case VECTOR_BFGS: 
00221       sprintf((char *)buf,"VECTOR_BFGS");
00222       break;
00223     case STEEP_DESC:
00224       sprintf((char *)buf,"STEEP_DESC");
00225       break;
00226     case NMSIMPLEX:
00227       sprintf((char *)buf,"NMSIMPLEX");
00228       break;
00229     case SIMAN:
00230       sprintf((char *)buf,"SIMAN");
00231       break;
00232     case LMSDR:
00233       sprintf((char *)buf,"LMSDR");
00234       break;
00235     case LMDR:
00236       sprintf((char *)buf,"LMDR");
00237       break;
00238 #ifdef HAVE_OOL
00239     case OOL_SPG: 
00240       sprintf((char *)buf,"OOL_SPG");
00241       break;
00242     case OOL_GENCAN: 
00243       sprintf((char *)buf,"OOL_GENCAN");
00244       break;
00245 #endif
00246     case CLMSDR:
00247       sprintf((char *)buf,"CLMSDR");
00248       break;
00249     case CLMDR:
00250       sprintf((char *)buf,"CLMDR");
00251       break;
00252 #ifdef HAVE_LEVMAR
00253     case LEVMAR:
00254       sprintf((char *)buf,"LEVMAR");
00255       break;
00256 #endif
00257     default: 
00258       break;
00259   }
00260   xml_node = xmlNewTextChild(xml_section, NULL,               \
00261                              (unsigned char*)"fit_method", \
00262                              (unsigned char*)buf);
00263  
00264   xml_comment = xmlNewComment((const xmlChar *) \
00265   " ====================================================================== ");
00266   xmlAddChild(xml_root,xml_comment);
00267 
00268   /*---------------------------------
00269    * <data_section/> node 
00270    */
00271   xml_section = xmlNewChild(xml_root, NULL,                     \
00272                             (unsigned char*)"data_section", \
00273                             NULL);
00274   
00275   for (i=0; i<yanera->number_of_data; i++)
00276   {
00277     /*---------------------------------
00278      * Add a comment spacer before every <data/>
00279      */ 
00280     xml_comment = xmlNewComment((const xmlChar *)" ===== ");
00281     xmlAddChild(xml_section, xml_comment);
00282     
00283     /*---------------------------------
00284      *  <data/> node
00285      */
00286     xml_node_data = xmlNewChild(xml_section, NULL,         \
00287                                    (unsigned char*)"data", \
00288                                    NULL);
00289     memset(buf, '\0', 30);
00290     sprintf((char *)buf,"%s",yanera->data[i].data_id);
00291     xmlSetProp(xml_node_data, (unsigned char*)"data_id", \
00292                                   (unsigned char*)buf);
00293     
00294     xml_node = xmlNewTextChild(xml_node_data, NULL,    \
00295                                (unsigned char*)"file_name", \
00296                                (unsigned char*)yanera->data[i].file_name);
00297     xml_node_resolution  = xmlNewChild(xml_node_data, NULL, 
00298                                       (unsigned char*)"resolution", 
00299                                       NULL);
00300                                       
00301     memset(buf, '\0', 30);
00302     switch (yanera->data[i].resolution.type) {
00303       case RESOLUTION_NONE: 
00304         sprintf((char *)buf,"RESOLUTION_NONE");
00305         break;
00306       case RESOLUTION_CONSTANT: 
00307         sprintf((char *)buf,"RESOLUTION_CONSTANT");
00308         break;
00309       case RESOLUTION_RELATIVE: 
00310         sprintf((char *)buf,"RESOLUTION_RELATIVE");
00311         break;
00312       case RESOLUTION_ARRAY_CONSTANT: 
00313         sprintf((char *)buf,"RESOLUTION_ARRAY_CONSTANT");
00314         break;
00315       case RESOLUTION_ARRAY_RELATIVE: 
00316         sprintf((char *)buf,"RESOLUTION_ARRAY_RELATIVE");
00317         break;
00318       default: 
00319         break;
00320     }
00321     xml_node = xmlNewTextChild(xml_node_resolution, NULL, \
00322                                 (unsigned char*)"type",     \
00323                                 (unsigned char*)buf);
00324     memset(buf, '\0', 30);
00325     if (yanera->data[i].resolution.value != NULL)
00326     { 
00327       sprintf((char *)buf,"%g",yanera->data[i].resolution.value[0]); 
00328       xml_node = xmlNewTextChild(xml_node_resolution, NULL, \
00329                                 (unsigned char*)"value",    \
00330                                 (unsigned char*)buf);
00331     }
00332     else
00333     {
00334       xml_node = xmlNewTextChild(xml_node_resolution, NULL, \
00335                                 (unsigned char*)"value",    \
00336                                 (unsigned char*)NULL);
00337     }
00338     xml_node = xmlNewTextChild(xml_node_resolution, NULL, \
00339                        (unsigned char*)"file_name", \
00340                        (unsigned char*)yanera->data[i].resolution.file_name);
00341     
00342   }
00343   /*---------------------------------
00344    * Add a comment spacer before end of <data_section/>
00345    */      
00346   xml_comment = xmlNewComment((const xmlChar *)" ===== ");
00347   xmlAddChild(xml_section,xml_comment);
00348   
00349   /*---------------------------------
00350    * Add a large comment spacer between <data_section/> 
00351    * and <model_section/>
00352    */  
00353   xml_comment = xmlNewComment((const xmlChar *)\
00354   " ====================================================================== ");
00355   xmlAddChild(xml_root,xml_comment);
00356 
00357   /*---------------------------------
00358    * <model_section/> node 
00359    */
00360   xml_section = xmlNewChild(xml_root, NULL,                  \
00361                             (unsigned char*)"model_section", \
00362                             NULL);
00363   /*---------------------------------
00364    * Add a comment spacer before <model_type/>
00365    */
00366   xml_comment = xmlNewComment((const xmlChar *)" ===== ");
00367   xmlAddChild(xml_section, xml_comment);
00368 
00369   /*---------------------------------
00370    * <model_type/>
00371    */
00372   memset(buf, '\0', 30);
00373   switch (yanera->type) {
00374     case MODEL_LAYER: 
00375       sprintf((char *)buf,"MODEL_LAYER");
00376       break;
00377     case MODEL_SLAB: 
00378       sprintf((char *)buf,"MODEL_SLAB");
00379       break;
00380     case MODEL_COMPONENT: 
00381       sprintf((char *)buf,"MODEL_COMPONENT");
00382       break;
00383     case MODEL_FUNCTION: 
00384       sprintf((char *)buf,"MODEL_FUNCTION");
00385       break;
00386     default: 
00387       break;
00388   }
00389   xml_node = xmlNewTextChild(xml_section, NULL,            \
00390                              (unsigned char*)"model_type", \
00391                              (unsigned char*)buf);
00392 
00393   /*---------------------------------
00394    * <components/> 
00395    */
00396   layer = yanera->components;
00397   if (layer != NULL)
00398   {
00399      /*---------------------------------
00400      * Add a comment spacer after <model_type/>, before <component/>
00401      */
00402     xml_comment = xmlNewComment((const xmlChar *)" ===== ");
00403     xmlAddChild(xml_section, xml_comment);
00404   }
00405   while (layer != NULL)
00406   {
00407     xml_node_layer = xmlNewChild(xml_section, NULL, \
00408                                  (unsigned char*)"component", NULL);
00409     xmlLayer(xml_node_layer, layer, yanera);
00410     layer = layer->next;
00411   };
00412 
00413   /*---------------------------------
00414    * <model/>
00415    */
00416   for (i=0; i<yanera->number_of_models; i++) 
00417   {
00418     /*---------------------------------
00419      * Add a comment spacer  before every <model/>
00420      */
00421     xml_comment = xmlNewComment((const xmlChar *)" ===== ");
00422     xmlAddChild(xml_section, xml_comment);
00423     xml_node_model = xmlNewChild(xml_section, NULL,      \
00424                                 (unsigned char*)"model", \
00425                                  NULL);   
00426                                  
00427     if (yanera->models_xml[i].data_idref != NULL)
00428     {
00429       xmlSetProp(xml_node_model, (unsigned char*)"data_idref", \
00430                  (unsigned char*)yanera->models_xml[i].data_idref);
00431     }
00432 
00433     if (yanera->models_xml[i].name != NULL)
00434     {
00435       xml_node = xmlNewTextChild(xml_node_model, NULL,  \
00436                                 (unsigned char*)"name", \
00437                                 (unsigned char*)yanera->models_xml[i].name);
00438     }
00439     if (yanera->models_xml[i].polarized != POLARIZED_NONE)
00440     {
00441       memset(buf, '\0', 30);
00442       if (yanera->models_xml[i].polarized == POLARIZED_UP) 
00443       { sprintf((char *)buf,"POLARIZED_UP"); }
00444       else if (yanera->models_xml[i].polarized == POLARIZED_DOWN)
00445       {  sprintf((char *)buf,"POLARIZED_DOWN"); }
00446       else if (yanera->models_xml[i].polarized == POLARIZED_UNPOLARIZED)
00447       {  sprintf((char *)buf,"POLARIZED_UNPOLARIZED"); }
00448       xml_node = xmlNewTextChild(xml_node_model, NULL,       \
00449                                 (unsigned char*)"polarized", \
00450                                 (unsigned char*)buf);
00451     }
00452     
00453     layer = yanera->models_xml[i].first_layer;
00454     while (layer != NULL)
00455     {
00456       switch (layer->type)
00457       {
00458         case LAYER_BULK:
00459           xml_node_layer = xmlNewChild(xml_node_model, NULL, \
00460                                        (unsigned char*)"bulk", NULL);
00461           xmlLayer(xml_node_layer, layer, yanera);
00462           layer = layer->next;
00463           break;
00464         case LAYER_LAYER:
00465         case LAYER_BOX:
00466         case LAYER_GAUSSIAN:
00467         case LAYER_FUNCTION:
00468           xml_node_layer = xmlNewChild(xml_node_model, NULL, \
00469                                       (unsigned char*)"layer", NULL);
00470           xmlLayer(xml_node_layer, layer, yanera);
00471           layer = layer->next;
00472           break;
00473         case LAYER_REPEAT:
00474           /*
00475            * Put a <repeat/> node
00476            */
00477           xml_node_repeat = xmlNewChild(xml_node_model, NULL, \
00478                                        (unsigned char*)"repeat", NULL);
00479           /*
00480            * Children of the <repeat/> node. All <layer/> in one 
00481            * repeating block have the same repeat_flag, so
00482            * add the next <layer/> until repeat_flag increments.
00483            */         
00484           j = layer->repeat_flag;
00485           do {
00486               xml_node_layer = xmlNewChild(xml_node_repeat, NULL, \
00487                                           (unsigned char*)"layer", NULL);
00488               xmlLayer(xml_node_layer, layer, yanera);
00489               layer = layer->next;
00490           } while (j == layer->repeat_flag);
00491           /*
00492            * Count the number of times this is repeated:
00493            * Loop through <layer/>, and every time repeat_flag is incremented,
00494            * then increment variable r. 
00495            * r=1 to start, because above, we have already added one.
00496            * i still is the original repeat_flag, and repeat_flag will 
00497            * start over at 0 with a new <repeat/>
00498            */       
00499           r = 1;
00500           while (j < layer->repeat_flag)
00501           {
00502             k = layer->repeat_flag;
00503             do {
00504               layer = layer->next;
00505             } while (k == layer->repeat_flag);
00506             r = r + 1;
00507           };
00508           memset(buf, '\0', 30);
00509           sprintf((char *)buf, "%d", r);
00510           xmlSetProp(xml_node_repeat, \
00511                     (unsigned char*)"number", (unsigned char *)buf);
00512           break;
00513         case LAYER_SUBSTRATE:
00514           xml_node_layer = xmlNewChild(xml_node_model, NULL, \
00515                                       (unsigned char*)"substrate", NULL);
00516           xmlLayer(xml_node_layer, layer, yanera);
00517           layer = layer->next;
00518           break;
00519         default:
00520           break;
00521       }
00522     }
00523   
00524     if (yanera->models_xml[i].background != -1)
00525     {
00526       memset(buf, '\0', 30);
00527       sprintf((char *)buf,"%g", \
00528           yanera->parameters.p[yanera->models_xml[i].background]);
00529       xml_node = xmlNewTextChild(xml_node_model, NULL,        \
00530                                 (unsigned char*)"background", \
00531                                 (unsigned char *)buf);
00532       memset(buf, '\0', 30);
00533       setYesNoBooleanFromString((char *)buf, \
00534           yanera->parameters.f[yanera->models_xml[i].background]);
00535       xmlSetProp(xml_node, (unsigned char*)"fix", (unsigned char *)buf);
00536       
00537       /* ----- */
00538       xmlMinMax(xml_node, yanera->models_xml[i].background, yanera);
00539       xmlParameterError(xml_node, yanera->models_xml[i].background, yanera);
00540     }
00541   }
00542   /*---------------------------------
00543    * Add a comment spacer after all the <model/>
00544    */
00545   xml_comment = xmlNewComment((const xmlChar *)" ===== ");
00546   xmlAddChild(xml_section,xml_comment);
00547   /*---------------------------------
00548    * Add a comment spacer after the <model_section/>
00549    */
00550   xml_comment = xmlNewComment((const xmlChar *)\
00551   " ====================================================================== ");  
00552   xmlAddChild(xml_root,xml_comment);  
00553   /*------------------------------------------------
00554    *   Write to file.
00555    */
00556   xmlSaveFormatFileEnc("result.xml", xml_doc, "ISO-8859-1", 1);
00557   xmlFreeDoc(xml_doc);  
00558   xmlCleanupParser();
00559   return;
00560 }
00561 /*============================================================================*/
00562 void xmlLayer(xmlNodePtr xml_node_layer, \
00563               yanera_layer *layer, yanera_container *yanera)
00564 {
00565   xmlNodePtr       xml_node;
00566   char             buf[30];
00567   short            i;
00568   
00569   if (layer->layer_id != NULL)
00570   {
00571     xmlSetProp(xml_node_layer, (unsigned char*)"layer_id", \
00572               (unsigned char*)layer->layer_id);
00573   }
00574   if (layer->layer_idref != NULL)
00575   {
00576     xmlSetProp(xml_node_layer, (unsigned char*)"layer_idref", \
00577               (unsigned char*)layer->layer_idref);
00578   }
00579   if (layer->component_id != NULL)
00580   {
00581     xmlSetProp(xml_node_layer, (unsigned char*)"component_id", \
00582               (unsigned char*)layer->component_id);
00583   }
00584   if (layer->component_idref != NULL)
00585   {
00586     xmlSetProp(xml_node_layer, (unsigned char*)"component_idref", \
00587               (unsigned char*)layer->component_idref);
00588   }
00589   /* 
00590    * Set the layer component type.
00591    */
00592   if (layer->type == LAYER_BOX)
00593   {
00594     xml_node = xmlNewTextChild(xml_node_layer, NULL,   \
00595                                (unsigned char*)"type", \
00596                                (unsigned char*)"box");
00597   }
00598   if (layer->type == LAYER_GAUSSIAN)
00599   {
00600     xml_node = xmlNewTextChild(xml_node_layer, NULL,   \
00601                                (unsigned char*)"type", \
00602                                (unsigned char*)"gaussian");
00603   }
00604   if (layer->type == LAYER_FUNCTION)
00605   {
00606     xml_node = xmlNewTextChild(xml_node_layer, NULL,   \
00607                                (unsigned char*)"type", \
00608                                (unsigned char*)"function");
00609   }
00610   /* 
00611    * Set the layer name;
00612    */ 
00613   if (layer->name != NULL)
00614   {
00615     xml_node = xmlNewTextChild(xml_node_layer, NULL,  \
00616                               (unsigned char*)"name", \
00617                               (unsigned char*)layer->name);
00618   }
00619   /* 
00620    * Set the layer function;
00621    */ 
00622   if (layer->func != NULL)
00623   {
00624     xml_node = xmlNewTextChild(xml_node_layer, NULL, \
00625                             (unsigned char*)"func",  \
00626                             (unsigned char*)layer->func);
00627   }
00628   if (layer->parm_names != NULL)
00629   {
00630     for(i=0; i<layer->number_of_parm; i++)
00631     {
00632       memset(buf, '\0', 30);
00633       sprintf(buf,"%g", yanera->parameters.p[layer->parm_values[i]]);
00634       xml_node = xmlNewTextChild(xml_node_layer, NULL,   \
00635                                  (unsigned char*)"parm", \
00636                                  (unsigned char*)buf);
00637       
00638       memset(buf, '\0', 30);
00639       sprintf((char *)buf,"%c",layer->parm_names[i]);                 
00640       xmlSetProp(xml_node, (unsigned char*)"name", \
00641                            (unsigned char*)buf);
00642       
00643       memset(buf, '\0', 30);
00644       setYesNoBooleanFromString((char *)buf, \
00645                                 yanera->parameters.f[layer->parm_values[i]]);
00646       xmlSetProp(xml_node, (unsigned char*)"fix", (unsigned char*)buf);
00647       
00648       /* ------- */
00649       xmlMinMax(xml_node, layer->parm_values[i], yanera);
00650       xmlParameterError(xml_node, layer->parm_values[i], yanera);
00651     }
00652   }
00653   /* 
00654    * Set the layer thickness
00655    */
00656   if (layer->thik != -1) 
00657   {
00658     memset(buf, '\0', 30);
00659     if (layer->thik == -2) 
00660       sprintf((char *)buf,"n/a");
00661     else
00662       sprintf(buf,"%g", yanera->parameters.p[layer->thik]);
00663     xml_node = xmlNewTextChild(xml_node_layer, NULL,   \
00664                                (unsigned char*)"thik", \
00665                                (unsigned char*)buf);
00666     memset(buf, '\0', 30);
00667     if (layer->thik == -2) 
00668       sprintf((char *)buf,"yes");
00669     else
00670       setYesNoBooleanFromString((char *)buf,yanera->parameters.f[layer->thik]);
00671     xmlSetProp(xml_node, (unsigned char*)"fix", (unsigned char*)buf);
00672     
00673     /* ------- */
00674     xmlMinMax(xml_node, layer->thik, yanera);
00675     xmlParameterError(xml_node, layer->thik, yanera);
00676   }
00677   /* 
00678    * Set the layer roughness.
00679    */
00680   if (layer->sigz != -1) 
00681   {
00682     memset(buf, '\0', 30);
00683     if (layer->sigz == -2) 
00684       sprintf((char *)buf,"n/a");
00685     else
00686       sprintf((char *)buf,"%g", yanera->parameters.p[layer->sigz]);
00687     xml_node = xmlNewTextChild(xml_node_layer, NULL,   \
00688                                (unsigned char*)"sigz", \
00689                                (unsigned char*)buf);
00690     memset(buf, '\0', 30);
00691     if (layer->sigz == -2) 
00692       sprintf((char *)buf,"yes");
00693     else
00694       setYesNoBooleanFromString((char *)buf,yanera->parameters.f[layer->sigz]);
00695     xmlSetProp(xml_node, (unsigned char*)"fix", (unsigned char*)buf);
00696     
00697     /* ------- */
00698     xmlMinMax(xml_node, layer->sigz, yanera);
00699     xmlParameterError(xml_node, layer->sigz, yanera);
00700   }
00701   /* 
00702    * Set the layer center.
00703    */
00704   if (layer->cntr != -1) 
00705   {
00706     memset(buf, '\0', 30);
00707     if (layer->cntr == -2) 
00708       sprintf((char *)buf,"n/a");
00709     else
00710       sprintf((char *)buf,"%g", yanera->parameters.p[layer->cntr]);
00711     xml_node = xmlNewTextChild(xml_node_layer, NULL,   \
00712                                (unsigned char*)"cntr", \
00713                                (unsigned char*)buf);
00714     memset(buf, '\0', 30);
00715     if (layer->cntr == -2) 
00716       sprintf((char *)buf,"yes");
00717     else
00718       setYesNoBooleanFromString((char *)buf,yanera->parameters.f[layer->cntr]);
00719     xmlSetProp(xml_node, (unsigned char*)"fix", (unsigned char*)buf);
00720     
00721     /* ------- */
00722     xmlMinMax(xml_node, layer->cntr, yanera);
00723     xmlParameterError(xml_node, layer->cntr, yanera);
00724   }
00725   /* 
00726    * Set the layer real sld.
00727    */
00728   if (layer->rsld != -1) 
00729   {
00730     memset(buf, '\0', 30);
00731     if (layer->rsld == -2) 
00732       sprintf((char *)buf,"n/a");
00733     else
00734       sprintf(buf,"%g", yanera->parameters.p[layer->rsld]);
00735     xml_node = xmlNewTextChild(xml_node_layer, NULL,   \
00736                                (unsigned char*)"rsld", \
00737                                (unsigned char*)buf);
00738     memset(buf, '\0', 30);
00739     if (layer->rsld == -2) 
00740       sprintf((char *)buf,"yes");
00741     else
00742       setYesNoBooleanFromString((char *)buf,yanera->parameters.f[layer->rsld]);
00743     xmlSetProp(xml_node, (unsigned char*)"fix", (unsigned char*)buf);
00744     
00745     /* ------- */
00746     xmlMinMax(xml_node, layer->rsld, yanera);
00747     xmlParameterError(xml_node, layer->rsld, yanera);
00748   } 
00749   /* 
00750    * Set the layer imaginary sld.
00751    */
00752   if (layer->isld != -1) 
00753   {
00754     memset(buf, '\0', 30);
00755     if (layer->isld == -2) 
00756       sprintf((char *)buf,"n/a");
00757     else
00758       sprintf(buf,"%g", yanera->parameters.p[layer->isld]);
00759     xml_node = xmlNewTextChild(xml_node_layer, NULL,   \
00760                                (unsigned char*)"isld", \
00761                                (unsigned char*)buf);
00762     memset(buf, '\0', 30);
00763     if (layer->isld == -2) 
00764       sprintf((char *)buf,"yes");
00765     else
00766       setYesNoBooleanFromString((char *)buf,yanera->parameters.f[layer->isld]);
00767     xmlSetProp(xml_node, (unsigned char*)"fix", (unsigned char*)buf);
00768     
00769     /* ------- */
00770     xmlMinMax(xml_node, layer->isld, yanera);
00771     xmlParameterError(xml_node, layer->isld, yanera);
00772   }   
00773   /* 
00774    * Set the layer real magnetic sld.
00775    */
00776   if (layer->rmag != -1) 
00777   {
00778     memset(buf, '\0', 30);
00779     if (layer->rmag == -2) 
00780       sprintf((char *)buf,"n/a");
00781     else
00782       sprintf(buf,"%g", yanera->parameters.p[layer->rmag]);
00783     xml_node = xmlNewTextChild(xml_node_layer, NULL,   \
00784                                (unsigned char*)"rmag", \
00785                                (unsigned char*)buf);
00786     memset(buf, '\0', 30);
00787     if (layer->rmag == -2) 
00788       sprintf((char *)buf,"yes");
00789     else
00790       setYesNoBooleanFromString((char *)buf,yanera->parameters.f[layer->rmag]);
00791     xmlSetProp(xml_node, (unsigned char*)"fix", (unsigned char*)buf);
00792     
00793     /* ------- */
00794     xmlMinMax(xml_node, layer->rmag, yanera);
00795     xmlParameterError(xml_node, layer->rmag, yanera);
00796   }   
00797   /* 
00798    * Set the layer include.
00799    */
00800   if (layer->include_flag == NO) 
00801   {
00802 
00803     xml_node = xmlNewTextChild(xml_node_layer, NULL,      \
00804                                (unsigned char*)"include", \
00805                                (unsigned char*)"no");
00806   }  
00807 
00808   return;
00809 }
00810 /*============================================================================*/
00811 void xmlMinMax(xmlNodePtr xml_node_layer_item, short parm_index, \
00812                yanera_container *yanera)
00813 {
00814   xmlNodePtr xml_node;
00815   char             buf[30];
00816     
00817   if ((yanera->parameters.con[parm_index] == CONSTRAIN_MIN) ||
00818       (yanera->parameters.con[parm_index] == CONSTRAIN_BOTH))
00819   {
00820     memset(buf, '\0', 30);
00821     sprintf(buf,"%g", yanera->parameters.min[parm_index]);
00822     xml_node = xmlNewTextChild(xml_node_layer_item, NULL,   \
00823                                (unsigned char*)"min", \
00824                                (unsigned char*)buf);
00825   }
00826   if ((yanera->parameters.con[parm_index] == CONSTRAIN_MAX) ||
00827       (yanera->parameters.con[parm_index] == CONSTRAIN_BOTH))
00828   {
00829     memset(buf, '\0', 30);
00830     sprintf(buf,"%g", yanera->parameters.max[parm_index]);
00831     xml_node = xmlNewTextChild(xml_node_layer_item, NULL,   \
00832                                (unsigned char*)"max", \
00833                                (unsigned char*)buf);
00834   }
00835   
00836   return;
00837 }
00838 /*============================================================================*/
00839 void xmlParameterError(xmlNodePtr xml_node_layer_item, short parm_index, \
00840               yanera_container *yanera)
00841 {
00842   xmlNodePtr xml_node;
00843   char       buf[30];
00844   
00845   if ((yanera->misc.fit_do == YES) &&
00846       (parm_index >= 0))
00847   {
00848     memset(buf, '\0', 30);
00849     sprintf(buf,"%g", yanera->parameters.tmp[parm_index]);
00850     xml_node = xmlNewTextChild(xml_node_layer_item, NULL,   \
00851                                (unsigned char*)"err", \
00852                                (unsigned char*)buf);
00853   }
00854   return;
00855 }

Generated on Thu May 29 10:56:33 2008 by  doxygen 1.5.5