diff options
Diffstat (limited to 'src/flow.c')
-rw-r--r-- | src/flow.c | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/src/flow.c b/src/flow.c new file mode 100644 index 0000000..d271e44 --- /dev/null +++ b/src/flow.c @@ -0,0 +1,167 @@ +/* +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. +*/ + +#include "flow.h" + +#include <stdio.h> +#include <stdlib.h> +#include "tools.h" +#include "math.h" +#include "definitions.cpp" +#include "number.h" +#include "array.h" +#include "coefficient.h" + + + +// compute flow numerically, no exponentials +// inputs: flow_equation +// init, niter, tol (the allowed error at each step), ls (whether to display the results in terms of ls), display_mode (what to print) +int numerical_flow(Grouped_Polynomial flow_equation, RCC init, Labels labels, int niter, long double tol, int display_mode){ + // running coupling contants + RCC rccs=init; + int i,j; + + if(display_mode==DISPLAY_NUMERICAL){ + // print labels + printf("%5s ","n"); + for(j=0;j<rccs.length;j++){ + print_label(rccs.indices[j], labels); + } + printf("\n\n"); + + // print initial values + printf("%5d ",0); + for(j=0;j<rccs.length;j++){ + printf("% 14.7Le ",rccs.values[j]); + } + printf("\n"); + } + + for(i=0;i<niter;i++){ + // compute a single step + step_flow(&rccs, flow_equation, tol); + // convert ls to alphas + if(display_mode==DISPLAY_NUMERICAL){ + // print the result + printf("%5d ",i+1); + for(j=0;j<rccs.length;j++){ + printf("% 14.7Le ",rccs.values[j]); + } + printf("\n"); + } + } + + if(display_mode==DISPLAY_NUMERICAL){ + // print labels + printf("\n"); + printf("%5s ","n"); + for(j=0;j<rccs.length;j++){ + print_label(rccs.indices[j], labels); + } + printf("\n\n"); + } + + if(display_mode==DISPLAY_FINAL){ + RCC_print(rccs); + } + + return(0); +} + +// single step in the flow no exponentials +// inputs: flow_equation, tol +// input/outputs: rccs +int step_flow(RCC* rccs, Grouped_Polynomial flow_equation, long double tol){ + int i; + long double* new_rccs=calloc((*rccs).length,sizeof(long double)); + Int_Array computed; + + init_Int_Array(&computed, (*rccs).length); + + // initialize vectors to 0 + for(i=0;i<(*rccs).length;i++){ + new_rccs[i]=0.; + } + + // compute the constants first + for(i=0;i<flow_equation.length;i++){ + if(flow_equation.indices[i]<0){ + evalcoef(*rccs, flow_equation.coefs[i], new_rccs+i); + // if the new rcc is too small, then ignore it + if(fabs(new_rccs[i])<tol){ + new_rccs[i]=0.; + } + (*rccs).values[i]=new_rccs[i]; + } + } + + // for each equation + for(i=0;i<flow_equation.length;i++){ + if(flow_equation.indices[i]>=0){ + evalcoef(*rccs, flow_equation.coefs[i], new_rccs+i); + // if the new rcc is too small, then ignore it + if(fabs(new_rccs[i])<tol){ + new_rccs[i]=0.; + } + } + } + + // copy results to rccs + for(i=0;i<(*rccs).length;i++){ + (*rccs).values[i]=new_rccs[i]; + } + + // free memory + free_Int_Array(computed); + free(new_rccs); + return(0); +} + + +// print the label of an rcc (takes constants and derivatives into account) +int print_label(int index, Labels labels){ + int i; + int nderivs; + int posin_labels; + Char_Array label; + + // constant term + if(index<0){ + nderivs=-index/DOFFSET; + for (i=0;i<12-nderivs;i++){ + printf(" "); + } + for(i=0;i<nderivs;i++){ + printf("d"); + } + printf("C%d ",-index-nderivs*DOFFSET); + } + else{ + nderivs=index/DOFFSET; + posin_labels=intlist_find_err(labels.indices, labels.length, index-nderivs*DOFFSET); + label=labels.labels[posin_labels]; + for (i=0;i<14-label.length-nderivs;i++){ + printf(" "); + } + for(i=0;i<nderivs;i++){ + printf("d"); + } + printf("%s ",char_array_to_str_noinit(labels.labels+posin_labels)); + } + + return(0); +} |