1
0
mirror of https://github.com/TREX-CoE/qmckl.git synced 2024-07-18 08:53:47 +02:00
qmckl/src/qmckl_context.org

248 lines
6.1 KiB
Org Mode
Raw Normal View History

2020-10-14 00:52:50 +02:00
# -*- mode: org -*-
2020-10-16 13:58:05 +02:00
# vim: syntax=c
2020-10-15 08:57:01 +02:00
#+TITLE: Context
2020-10-14 01:43:13 +02:00
This file is written in C because it is more natural to express the context in
C than in Fortran.
2020-10-14 01:43:13 +02:00
2020-10-16 13:58:05 +02:00
#+BEGIN_SRC C :tangle qmckl_context.h
#ifndef QMCKL_CONTEXT_H
#define QMCKL_CONTEXT_H
#include "qmckl.h"
#+END_SRC
2020-10-14 01:43:13 +02:00
2020-10-14 00:52:50 +02:00
#+BEGIN_SRC C :tangle qmckl_context.c
#include <stdlib.h> /* malloc */
#include "qmckl_context.h"
#+END_SRC
* Context
2020-10-14 01:43:13 +02:00
2020-10-14 00:52:50 +02:00
The context variable is a handle for the state of the library, and
is stored in the following data structure, which can't be seen
outside of the library.
#+BEGIN_SRC C :tangle qmckl_context.h
/* 64-bit integer */
2020-10-14 01:43:13 +02:00
typedef long long int qmckl_context ;
2020-10-14 00:52:50 +02:00
#+END_SRC
#+BEGIN_SRC C :tangle qmckl_context.c
2020-10-16 13:58:05 +02:00
typedef struct qmckl_context_struct {
struct qmckl_context_struct * prev;
2020-10-14 01:43:13 +02:00
int precision;
int range;
2020-10-14 00:52:50 +02:00
} qmckl_context_struct;
#+END_SRC
** =qmckl_context_create=
2020-10-14 00:52:50 +02:00
To create a new context, use =qmckl_context_create()=. If the creation
failed, the function returns =0=. On success, a pointer to a context
is returned as a 64-bit integer.
#+BEGIN_SRC C :tangle qmckl_context.h
2020-10-14 00:52:50 +02:00
qmckl_context qmckl_context_create();
#+END_SRC
2020-10-14 00:52:50 +02:00
#+BEGIN_SRC C :tangle qmckl_context.c
2020-10-14 00:52:50 +02:00
qmckl_context qmckl_context_create() {
qmckl_context_struct* context;
context = (qmckl_context_struct*) malloc (sizeof(qmckl_context_struct));
if (context == NULL) {
return (qmckl_context) 0;
}
context->prev = NULL;
context->precision = QMCKL_DEFAULT_PRECISION;
context->range = QMCKL_DEFAULT_RANGE;
return (qmckl_context) context;
}
#+END_SRC
2020-10-14 01:43:13 +02:00
** =qmckl_context_copy=
2020-10-14 00:52:50 +02:00
#+BEGIN_SRC C :tangle qmckl_context.h
qmckl_context qmckl_context_copy(const qmckl_context context);
#+END_SRC
2020-10-14 00:52:50 +02:00
#+BEGIN_SRC C :tangle qmckl_context.c
qmckl_context qmckl_context_copy(const qmckl_context context) {
2020-10-14 00:52:50 +02:00
qmckl_context_struct* old_context;
qmckl_context_struct* new_context;
new_context = (qmckl_context_struct*) malloc (sizeof(qmckl_context_struct));
if (new_context == NULL) {
return (qmckl_context) 0;
}
old_context = (qmckl_context_struct*) context;
new_context->prev = old_context;
2020-10-14 01:43:13 +02:00
new_context->precision = old_context->precision;
2020-10-14 00:52:50 +02:00
new_context->range = old_context->range;
return (qmckl_context) new_context;
}
#+END_SRC
2020-10-14 01:43:13 +02:00
** =qmckl_context_destroy=
To delete a new context, use =qmckl_context_destroy()=. If the deletion
failed, the function returns =0=. On success, the function returns =1=
implying that the context has been freed.
#+BEGIN_SRC C :tangle qmckl_context.h
2020-10-15 12:36:52 +02:00
int qmckl_context_destroy(qmckl_context context);
#+END_SRC
#+BEGIN_SRC C :tangle qmckl_context.c
2020-10-15 12:36:52 +02:00
int qmckl_context_destroy(qmckl_context context) {
2020-10-15 12:36:52 +02:00
qmckl_context_struct* ctx;
ctx = (qmckl_context_struct*) context;
if (ctx == NULL) {
return 0;
}
2020-10-15 12:36:52 +02:00
free(ctx);
return 1;
}
#+END_SRC
2020-10-14 00:52:50 +02:00
* Precision
The following functions set and get the expected required precision
and range. =precision= should be an integer between 2 and 53, and
=range= should be an integer between 2 and 11.
2020-10-16 13:58:05 +02:00
The setter functions functions return a new context as a 64-bit integer.
The getter functions return the value, as a 32-bit integer.
2020-10-16 13:58:05 +02:00
The update functions return =QMCKL_SUCCESS= or =QMCKL_FAILURE=.
2020-10-14 00:52:50 +02:00
2020-10-16 13:58:05 +02:00
** =qmckl_context_update_precision=
#+BEGIN_SRC C :tangle qmckl_context.h
2020-10-16 13:58:05 +02:00
qmckl_exit_code qmckl_context_update_precision(const qmckl_context context, int precision);
#+END_SRC
2020-10-14 00:52:50 +02:00
#+BEGIN_SRC C :tangle qmckl_context.c
2020-10-16 13:58:05 +02:00
qmckl_exit_code qmckl_context_update_precision(const qmckl_context context, int precision) {
2020-10-14 00:52:50 +02:00
qmckl_context_struct* ctx;
2020-10-16 13:58:05 +02:00
if (precision < 2) return QMCKL_FAILURE;
if (precision > 53) return QMCKL_FAILURE;
ctx = (qmckl_context_struct*) context;
if (ctx == NULL) return QMCKL_FAILURE;
2020-10-14 00:52:50 +02:00
ctx->precision = precision;
2020-10-16 13:58:05 +02:00
return QMCKL_SUCCESS;
}
#+END_SRC
** =qmckl_context_update_range=
#+BEGIN_SRC C :tangle qmckl_context.h
qmckl_exit_code qmckl_context_update_range(const qmckl_context context, int range);
#+END_SRC
#+BEGIN_SRC C :tangle qmckl_context.c
qmckl_exit_code qmckl_context_update_range(const qmckl_context context, int range) {
qmckl_context_struct* ctx;
if (range < 2) return QMCKL_FAILURE;
if (range > 11) return QMCKL_FAILURE;
ctx = (qmckl_context_struct*) context;
if (ctx == NULL) return QMCKL_FAILURE;
ctx->range = range;
return QMCKL_SUCCESS;
}
#+END_SRC
** =qmckl_context_set_precision=
#+BEGIN_SRC C :tangle qmckl_context.h
qmckl_context qmckl_context_set_precision(const qmckl_context context, int precision);
#+END_SRC
#+BEGIN_SRC C :tangle qmckl_context.c
qmckl_context qmckl_context_set_precision(const qmckl_context context, const int precision) {
qmckl_context new_context;
new_context = qmckl_context_copy(context);
if (new_context == 0) return 0;
if (qmckl_context_update_precision(context, precision) == QMCKL_FAILURE) return 0;
return new_context;
2020-10-14 00:52:50 +02:00
}
#+END_SRC
2020-10-14 00:52:50 +02:00
** =qmckl_context_set_range=
#+BEGIN_SRC C :tangle qmckl_context.h
qmckl_context qmckl_context_set_range(const qmckl_context context, int range);
#+END_SRC
2020-10-14 00:52:50 +02:00
#+BEGIN_SRC C :tangle qmckl_context.c
qmckl_context qmckl_context_set_range(const qmckl_context context, int range) {
2020-10-16 13:58:05 +02:00
qmckl_context new_context;
2020-10-14 00:52:50 +02:00
2020-10-16 13:58:05 +02:00
new_context = qmckl_context_copy(context);
if (new_context == 0) return 0;
2020-10-14 00:52:50 +02:00
2020-10-16 13:58:05 +02:00
if (qmckl_context_update_range(context, range) == QMCKL_FAILURE) return 0;
return new_context;
2020-10-14 00:52:50 +02:00
}
#+END_SRC
2020-10-14 00:52:50 +02:00
** =qmckl_context_get_precision=
2020-10-14 00:52:50 +02:00
#+BEGIN_SRC C :tangle qmckl_context.h
int qmckl_context_get_precision(const qmckl_context context);
#+END_SRC
#+BEGIN_SRC C :tangle qmckl_context.c
int qmckl_context_get_precision(const qmckl_context context) {
qmckl_context_struct* ctx;
ctx = (qmckl_context_struct*) context;
return ctx->precision;
}
#+END_SRC
** =qmckl_context_get_range=
#+BEGIN_SRC C :tangle qmckl_context.h
int qmckl_context_get_range(const qmckl_context context);
#+END_SRC
#+BEGIN_SRC C :tangle qmckl_context.c
int qmckl_context_get_range(const qmckl_context context) {
qmckl_context_struct* ctx;
ctx = (qmckl_context_struct*) context;
return ctx->range;
}
#+END_SRC
2020-10-14 00:52:50 +02:00
2020-10-16 13:58:05 +02:00
* End of header
#+BEGIN_SRC C :tangle qmckl_context.h
#endif
#+END_SRC