Ian Jauslin
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/flow_mpfr.c')
-rw-r--r--src/flow_mpfr.c128
1 files changed, 128 insertions, 0 deletions
diff --git a/src/flow_mpfr.c b/src/flow_mpfr.c
new file mode 100644
index 0000000..e03c130
--- /dev/null
+++ b/src/flow_mpfr.c
@@ -0,0 +1,128 @@
+/*
+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_mpfr.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+// define MPFR_USE_VA_LIST to enable the use of mpfr_inits and mpfr_clears
+#define MPFR_USE_VA_LIST
+// define MPFR_USE_FILE to enable the use of mpfr_printf
+#define MPFR_USE_FILE
+#include <mpfr.h>
+#include "tools.h"
+#include "math.h"
+#include "definitions.cpp"
+#include "number.h"
+#include "array.h"
+#include "coefficient.h"
+#include "flow.h"
+#include "rcc_mpfr.h"
+
+
+
+// compute flow numerically
+int numerical_flow_mpfr(Grouped_Polynomial flow_equation, RCC_mpfr init, Labels labels, int niter, int display_mode){
+ // running coupling contants
+ RCC_mpfr 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++){
+ mpfr_printf("% 14.7Re ",rccs.values[j]);
+ }
+ printf("\n");
+ }
+
+ for(i=0;i<niter;i++){
+ // compute a single step
+ step_flow_mpfr(&rccs, flow_equation);
+ // convert ls to alphas
+ if(display_mode==DISPLAY_NUMERICAL){
+ // print the result
+ printf("%5d ",i+1);
+ for(j=0;j<rccs.length;j++){
+ mpfr_printf("% 14.7Re ",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_mpfr_print(rccs);
+ }
+
+ return(0);
+}
+
+// single step in the flow
+int step_flow_mpfr(RCC_mpfr* rccs, Grouped_Polynomial flow_equation){
+ int i;
+ mpfr_t* res;
+
+ // security: this function assumes that the length of the rcc and the flow_equation are the same
+ if((*rccs).length!=flow_equation.length){
+ fprintf(stderr,"error: mismatch in the size of the flow equation and the rccs");
+ exit(-1);
+ }
+
+ res=calloc((*rccs).length,sizeof(mpfr_t));
+
+ // compute the constants first
+ for(i=0;i<flow_equation.length;i++){
+ if(flow_equation.indices[i]<0){
+ evalcoef_mpfr(*rccs, flow_equation.coefs[i], res[i]);
+ mpfr_set((*rccs).values[i], res[i], MPFR_RNDN);
+ }
+ }
+
+ // for each equation
+ for(i=0;i<flow_equation.length;i++){
+ if(flow_equation.indices[i]>=0){
+ evalcoef_mpfr(*rccs, flow_equation.coefs[i], res[i]);
+ }
+ }
+
+ // set new rccs
+ for(i=0;i<flow_equation.length;i++){
+ mpfr_set((*rccs).values[i], res[i], MPFR_RNDN);
+ mpfr_clear(res[i]);
+ }
+
+ // free memory
+ free(res);
+ return(0);
+}