From aa0f3ae2988d372b190b9bde2e75a6d17e744e93 Mon Sep 17 00:00:00 2001 From: Ian Jauslin Date: Sun, 14 Jun 2015 00:52:45 +0000 Subject: Initial commit --- src/numkondo.c | 226 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 226 insertions(+) create mode 100644 src/numkondo.c (limited to 'src/numkondo.c') diff --git a/src/numkondo.c b/src/numkondo.c new file mode 100644 index 0000000..dce7de6 --- /dev/null +++ b/src/numkondo.c @@ -0,0 +1,226 @@ +/* +Copyright 2015 Ian Jauslin + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +/* +numkondo + +Compute the flow of a flow equation numerically + +*/ + + +#include +#include + +// pre-compiler definitions +#include "definitions.cpp" + +// rccs +#include "rcc.h" +// grouped representation of polynomials +#include "grouped_polynomial.h" +// command line parser +#include "cli_parser.h" +// parse input file +#include "parse_file.h" +// numerical flow +#include "flow.h" +// arrays +#include "array.h" + +// read cli arguments +int read_args_numkondo(int argc,const char* argv[], Str_Array* str_args, Numkondo_Options* opts); +// print usage message +int print_usage_numkondo(); +// compute flow +int numflow(Str_Array str_args, Numkondo_Options opts); + + +int main (int argc, const char* argv[]){ + // string arguments + Str_Array str_args; + // options + Numkondo_Options opts; + + // read command-line arguments + read_args_numkondo(argc,argv,&str_args,&opts); + + numflow(str_args, opts); + + //free memory + free_Str_Array(str_args); + return(0); +} + + +// parse command-line arguments +#define CP_FLAG_NITER 1 +#define CP_FLAG_TOL 2 +#define CP_FLAG_RCCS 3 +int read_args_numkondo(int argc,const char* argv[], Str_Array* str_args, Numkondo_Options* opts){ + int i; + // pointers + char* ptr; + // file to read the polynomial from in flow mode + const char* file=""; + // flag that indicates what argument is being read + int flag=0; + // whether a file was specified on the command-line + int exists_file=0; + + // if there are no arguments + if(argc==1){ + print_usage_numkondo(); + exit(-1); + } + + // defaults + // display entire flow + (*opts).display_mode=DISPLAY_NUMERICAL; + // default niter + (*opts).niter=100; + // default to 0 tolerance + (*opts).tol=0; + // mark rccstring so that it can be recognized whether it has been set or not + (*opts).eval_rccstring.length=-1; + +// loop over arguments +for(i=1;i\n\n"); + return(0); +} + + +// numerical computation of the flow +int numflow(Str_Array str_args, Numkondo_Options opts){ + // index of the entry in the input file + int arg_index; + // list of rccs + Labels labels; + // initial condition + RCC init_cd; + // flow equation + Grouped_Polynomial flow_equation; + + // parse id table + arg_index=find_str_arg("labels", str_args); + if(arg_index<0){ + fprintf(stderr,"error: no labels entry in the configuration file\n"); + exit(-1); + } + else{ + parse_labels(str_args.strs[arg_index], &labels); + } + + // parse flow equation + arg_index=find_str_arg("flow_equation", str_args); + if(arg_index<0){ + fprintf(stderr,"error: no flow equation entry in the configuration file\n"); + exit(-1); + } + else{ + char_array_to_Grouped_Polynomial(str_args.strs[arg_index], &flow_equation); + } + + // initial conditions + // check they were not specified on the command line + if(opts.eval_rccstring.length==-1){ + arg_index=find_str_arg("initial_condition", str_args); + if(arg_index<0){ + fprintf(stderr,"error: no initial condition in the configuration file or on the command line\n"); + exit(-1); + } + else{ + char_array_cpy(str_args.strs[arg_index],&(opts.eval_rccstring)); + } + } + // initialize the rccs + prepare_init(flow_equation.indices,flow_equation.length,&init_cd); + // read rccs from string + if(opts.eval_rccstring.length!=-1){ + parse_init_cd(opts.eval_rccstring, &init_cd); + free_Char_Array(opts.eval_rccstring); + } + + numerical_flow(flow_equation, init_cd, labels, opts.niter, opts.tol, opts.display_mode); + + free_RCC(init_cd); + + // free memory + free_Labels(labels); + free_Grouped_Polynomial(flow_equation); + return(0); +} + -- cgit v1.2.3-70-g09d2