1
0
mirror of https://github.com/TREX-CoE/qmckl.git synced 2024-06-30 00:44:52 +02:00
qmckl/src/qmckl_context.org

419 lines
13 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-22 01:24:14 +02:00
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="http://www.pirilampo.org/styles/readtheorg/css/htmlize.css"/>
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="http://www.pirilampo.org/styles/readtheorg/css/readtheorg.css"/>
#+HTML_HEAD: <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
#+HTML_HEAD: <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="http://www.pirilampo.org/styles/lib/js/jquery.stickytableheaders.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="http://www.pirilampo.org/styles/readtheorg/js/readtheorg.js"></script>
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 19:42:12 +02:00
3 files are produced:
2020-10-22 00:50:07 +02:00
- a header file : =qmckl_context.h=
- a source file : =qmckl_context.c=
- a test file : =test_qmckl_context.c=
2020-10-16 19:42:12 +02:00
2020-10-25 15:16:02 +01:00
*** Header :noexport:
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.h
2020-10-16 13:58:05 +02:00
#ifndef QMCKL_CONTEXT_H
#define QMCKL_CONTEXT_H
#include "qmckl.h"
2020-10-16 19:42:12 +02:00
#+END_SRC
2020-10-14 01:43:13 +02:00
2020-10-25 15:16:02 +01:00
*** Source :noexport:
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.c
2020-10-16 23:56:22 +02:00
#include "qmckl.h"
2020-10-16 19:42:12 +02:00
#+END_SRC
2020-10-25 15:16:02 +01:00
*** Test :noexport:
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle test_qmckl_context.c
2020-10-22 00:50:07 +02:00
#include "qmckl.h"
#include "munit.h"
MunitResult test_qmckl_context() {
2020-10-16 19:42:12 +02:00
#+END_SRC
2020-10-14 00:52:50 +02:00
* 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
2020-10-16 19:42:12 +02:00
outside of the library. To simplify compatibility with other
languages, the pointer to the internal data structure is converted
into a 64-bit signed integer, defined in the =qmckl_context= type.
2020-10-22 01:24:14 +02:00
A value of 0 for the context is equivalent to a =NULL= pointer.
2020-10-14 00:52:50 +02:00
2020-10-16 19:42:12 +02:00
*** Source
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.c
2020-10-16 13:58:05 +02:00
typedef struct qmckl_context_struct {
struct qmckl_context_struct * prev;
2020-10-22 00:50:07 +02:00
uint32_t tag;
int32_t precision;
int32_t range;
2020-10-14 00:52:50 +02:00
} qmckl_context_struct;
#define VALID_TAG 0xBEEFFACE
#define INVALID_TAG 0xDEADBEEF
2020-10-16 19:42:12 +02:00
#+END_SRC
2020-10-22 00:50:07 +02:00
The tag is used internally to check if the memory domain pointed by
a pointer is a valid context.
2020-10-25 15:16:02 +01:00
*** Test :noexport:
2020-10-16 19:42:12 +02:00
We declare here the variables used in the tests.
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle test_qmckl_context.c
2020-10-16 19:42:12 +02:00
qmckl_context context;
qmckl_context new_context;
#+END_SRC
2020-10-16 19:52:11 +02:00
2020-10-22 00:50:07 +02:00
** =qmckl_context_check=
2020-10-22 00:50:07 +02:00
Checks if the domain pointed by the pointer is a valid context.
Returns the input =qmckl_context= if the context is valid, 0 otherwise.
*** Header
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.h
2020-10-22 00:50:07 +02:00
qmckl_context qmckl_context_check(const qmckl_context context) ;
2020-10-16 19:42:12 +02:00
#+END_SRC
2020-10-22 00:50:07 +02:00
*** Source
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.c
2020-10-22 00:50:07 +02:00
qmckl_context qmckl_context_check(const qmckl_context context) {
qmckl_context_struct * ctx;
if (context == (qmckl_context) 0) return (qmckl_context) 0;
2020-10-14 00:52:50 +02:00
ctx = (qmckl_context_struct*) context;
if (ctx->tag != VALID_TAG) return (qmckl_context) 0;
2020-10-22 00:50:07 +02:00
return context;
}
#+END_SRC
2020-10-22 00:50:07 +02:00
** =qmckl_context_create=
2020-10-14 00:52:50 +02:00
2020-10-16 19:42:12 +02:00
To create a new context, use =qmckl_context_create()=.
- On success, returns a pointer to a context using the =qmckl_context= type
- Returns 0 upon failure to allocate the internal data structure
2020-10-16 19:42:12 +02:00
*** Header
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.h
2020-10-14 00:52:50 +02:00
qmckl_context qmckl_context_create();
2020-10-16 19:42:12 +02:00
#+END_SRC
2020-10-14 00:52:50 +02:00
2020-10-16 19:42:12 +02:00
*** Source
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.c
2020-10-14 00:52:50 +02:00
qmckl_context qmckl_context_create() {
qmckl_context_struct* context;
2020-10-22 00:50:07 +02:00
context = (qmckl_context_struct*) qmckl_malloc ((qmckl_context) 0, sizeof(qmckl_context_struct));
2020-10-14 00:52:50 +02:00
if (context == NULL) {
return (qmckl_context) 0;
}
context->prev = NULL;
context->precision = QMCKL_DEFAULT_PRECISION;
context->range = QMCKL_DEFAULT_RANGE;
context->tag = VALID_TAG;
2020-10-14 00:52:50 +02:00
return (qmckl_context) context;
}
2020-10-16 19:42:12 +02:00
#+END_SRC
2020-10-22 00:50:07 +02:00
2020-10-25 15:16:02 +01:00
*** Test :noexport:
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle test_qmckl_context.c
2020-10-16 19:42:12 +02:00
context = qmckl_context_create();
2020-10-22 00:50:07 +02:00
munit_assert_int64( context, !=, (qmckl_context) 0);
munit_assert_int64( qmckl_context_check(context), ==, context);
2020-10-16 19:42:12 +02:00
#+END_SRC
2020-10-14 01:43:13 +02:00
** =qmckl_context_copy=
2020-10-14 00:52:50 +02:00
2020-10-16 19:42:12 +02:00
This function makes a shallow copy of the current context.
- Copying the 0-valued context returns 0
- On success, returns a pointer to the new context using the =qmckl_context= type
- Returns 0 upon failure to allocate the internal data structure
for the new context
*** Header
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.h
qmckl_context qmckl_context_copy(const qmckl_context context);
#+END_SRC
2020-10-14 00:52:50 +02:00
2020-10-16 19:42:12 +02:00
*** Source
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :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;
qmckl_context checked_context;
2020-10-14 00:52:50 +02:00
checked_context = qmckl_context_check(context);
if (checked_context == (qmckl_context) 0) {
2020-10-16 19:42:12 +02:00
return (qmckl_context) 0;
}
2020-10-22 00:50:07 +02:00
new_context = (qmckl_context_struct*) qmckl_malloc (context, sizeof(qmckl_context_struct));
2020-10-14 00:52:50 +02:00
if (new_context == NULL) {
return (qmckl_context) 0;
}
old_context = (qmckl_context_struct*) checked_context;
2020-10-14 00:52:50 +02:00
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;
new_context->tag = VALID_TAG;
2020-10-14 00:52:50 +02:00
return (qmckl_context) new_context;
}
#+END_SRC
2020-10-14 01:43:13 +02:00
2020-10-25 15:16:02 +01:00
*** Test :noexport:
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle test_qmckl_context.c
2020-10-16 19:42:12 +02:00
new_context = qmckl_context_copy(context);
2020-10-22 00:50:07 +02:00
munit_assert_int64(new_context, !=, (qmckl_context) 0);
munit_assert_int64(new_context, !=, context);
munit_assert_int64(qmckl_context_check(new_context), ==, new_context);
2020-10-16 19:42:12 +02:00
#+END_SRC
2020-10-16 19:42:12 +02:00
** =qmckl_context_previous=
2020-10-22 00:50:07 +02:00
2020-10-16 19:42:12 +02:00
Returns the previous context
- On success, returns the ancestor of the current context
- Returns 0 for the initial context
- Returns 0 for the 0-valued context
2020-10-16 19:42:12 +02:00
*** Header
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.h
2020-10-16 19:42:12 +02:00
qmckl_context qmckl_context_previous(const qmckl_context context);
#+END_SRC
2020-10-16 19:42:12 +02:00
*** Source
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.c
2020-10-16 19:42:12 +02:00
qmckl_context qmckl_context_previous(const qmckl_context context) {
qmckl_context checked_context;
2020-10-15 12:36:52 +02:00
qmckl_context_struct* ctx;
checked_context = qmckl_context_check(context);
if (checked_context == (qmckl_context) 0) {
2020-10-16 19:42:12 +02:00
return (qmckl_context) 0;
}
ctx = (qmckl_context_struct*) checked_context;
return qmckl_context_check((qmckl_context) ctx->prev);
2020-10-16 19:42:12 +02:00
}
#+END_SRC
2020-10-25 15:16:02 +01:00
*** Test :noexport:
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle test_qmckl_context.c
2020-10-22 00:50:07 +02:00
munit_assert_int64(qmckl_context_previous(new_context), !=, (qmckl_context) 0);
munit_assert_int64(qmckl_context_previous(new_context), ==, context);
munit_assert_int64(qmckl_context_previous(context), ==, (qmckl_context) 0);
munit_assert_int64(qmckl_context_previous((qmckl_context) 0), ==, (qmckl_context) 0);
2020-10-16 19:42:12 +02:00
#+END_SRC
** =qmckl_context_destroy=
2020-10-22 00:50:07 +02:00
2020-10-16 19:42:12 +02:00
Destroys the current context, leaving the ancestors untouched.
- Succeeds if the current context is properly destroyed
- Fails otherwise
- Fails if the 0-valued context is given in argument
- Fails if the the pointer is not a valid context
2020-10-22 00:50:07 +02:00
2020-10-16 19:42:12 +02:00
*** Header
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.h
qmckl_exit_code qmckl_context_destroy(qmckl_context context);
2020-10-16 19:42:12 +02:00
#+END_SRC
*** Source
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.c
qmckl_exit_code qmckl_context_destroy(qmckl_context context) {
2020-10-16 19:42:12 +02:00
qmckl_context_struct* ctx;
qmckl_context checked_context;
2020-10-22 00:50:07 +02:00
checked_context = qmckl_context_check(context);
if (checked_context == (qmckl_context) 0) return QMCKL_FAILURE;
2020-10-16 19:42:12 +02:00
ctx = (qmckl_context_struct*) context;
if (ctx == NULL) return QMCKL_FAILURE;
ctx->tag = INVALID_TAG;
2020-10-16 23:56:22 +02:00
qmckl_free(ctx);
2020-10-16 19:42:12 +02:00
return QMCKL_SUCCESS;
}
#+END_SRC
2020-10-14 00:52:50 +02:00
2020-10-25 15:16:02 +01:00
*** Test :noexport:
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle test_qmckl_context.c
2020-10-22 00:50:07 +02:00
munit_assert_int64(qmckl_context_check(new_context), ==, new_context);
munit_assert_int64(new_context, !=, (qmckl_context) 0);
munit_assert_int32(qmckl_context_destroy(new_context), ==, QMCKL_SUCCESS);
munit_assert_int64(qmckl_context_check(new_context), !=, new_context);
munit_assert_int64(qmckl_context_check(new_context), ==, (qmckl_context) 0);
munit_assert_int64(qmckl_context_destroy((qmckl_context) 0), ==, QMCKL_FAILURE);
2020-10-16 19:42:12 +02:00
#+END_SRC
2020-10-22 00:50:07 +02:00
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=
2020-10-31 19:07:57 +01:00
*** Header
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.h
2020-10-22 00:50:07 +02:00
qmckl_exit_code qmckl_context_update_precision(const qmckl_context context, const int precision);
#+END_SRC
2020-10-14 00:52:50 +02:00
2020-10-31 19:07:57 +01:00
*** Source
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.c
2020-10-22 00:50:07 +02:00
qmckl_exit_code qmckl_context_update_precision(const qmckl_context context, const 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
2020-10-25 15:16:02 +01:00
*** TODO Tests :noexport:
2020-10-16 13:58:05 +02:00
** =qmckl_context_update_range=
2020-10-31 19:07:57 +01:00
*** Header
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.h
2020-10-22 00:50:07 +02:00
qmckl_exit_code qmckl_context_update_range(const qmckl_context context, const int range);
2020-10-16 13:58:05 +02:00
#+END_SRC
2020-10-22 00:50:07 +02:00
2020-10-31 19:07:57 +01:00
*** Source
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.c
2020-10-22 00:50:07 +02:00
qmckl_exit_code qmckl_context_update_range(const qmckl_context context, const int range) {
2020-10-16 13:58:05 +02:00
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
2020-10-25 15:16:02 +01:00
*** TODO Tests :noexport:
2020-10-16 13:58:05 +02:00
** =qmckl_context_set_precision=
2020-10-31 19:07:57 +01:00
*** Header
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.h
2020-10-22 00:50:07 +02:00
qmckl_context qmckl_context_set_precision(const qmckl_context context, const int precision);
2020-10-16 13:58:05 +02:00
#+END_SRC
2020-10-31 19:07:57 +01:00
*** Source
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.c
2020-10-16 13:58:05 +02:00
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
2020-10-25 15:16:02 +01:00
*** TODO Tests :noexport:
** =qmckl_context_set_range=
2020-10-31 19:07:57 +01:00
*** Header
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.h
2020-10-22 00:50:07 +02:00
qmckl_context qmckl_context_set_range(const qmckl_context context, const int range);
#+END_SRC
2020-10-14 00:52:50 +02:00
2020-10-31 19:07:57 +01:00
*** Source
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.c
2020-10-22 00:50:07 +02:00
qmckl_context qmckl_context_set_range(const qmckl_context context, const 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-25 15:16:02 +01:00
*** TODO Tests :noexport:
2020-10-22 01:24:14 +02:00
** =qmckl_context_get_precision=
2020-10-31 19:07:57 +01:00
*** Header
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.h
int qmckl_context_get_precision(const qmckl_context context);
#+END_SRC
2020-10-31 19:07:57 +01:00
*** Source
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :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
2020-10-25 15:16:02 +01:00
*** TODO Tests :noexport:
** =qmckl_context_get_range=
2020-10-31 19:07:57 +01:00
*** Header
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.h
int qmckl_context_get_range(const qmckl_context context);
#+END_SRC
2020-10-31 19:07:57 +01:00
*** Source
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :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-25 15:16:02 +01:00
*** TODO Tests :noexport:
2020-10-22 00:50:07 +02:00
2020-10-30 16:22:29 +01:00
* Info about the molecular system
** TODO =qmckl_context_set_nucl_coord=
** TODO =qmckl_context_set_nucl_charge=
** TODO =qmckl_context_set_elec_num=
2020-10-25 15:16:02 +01:00
* End of files :noexport:
2020-10-16 13:58:05 +02:00
2020-10-16 19:42:12 +02:00
*** Header
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle qmckl_context.h
2020-10-16 13:58:05 +02:00
#endif
2020-10-16 19:42:12 +02:00
#+END_SRC
*** Test
2020-10-21 19:50:18 +02:00
#+BEGIN_SRC C :comments link :tangle test_qmckl_context.c
2020-10-22 00:50:07 +02:00
return MUNIT_OK;
}
2020-10-16 19:42:12 +02:00
#+END_SRC
2020-10-16 13:58:05 +02:00