Commit 35997746 authored by remi.clement's avatar remi.clement
Browse files

update html documentation

Showing with 1728 additions and 0 deletions
+1728 -0
# Sphinx build info version 1
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
config: c73cd0e1ac8a8c304acd5706bcab5918
tags: 645f666f9bcd5a90fca523b33c5a78b7
public/html/_images/cable.jpg

16.6 KB

public/html/_images/connection.jpg

1.74 MB

public/html/_images/current_board.jpg

136 KB

public/html/_images/electrode_cable.jpg

3.53 MB

public/html/_images/ige.png

4.37 KB

public/html/_images/logo-iris.jpg

14.3 KB

public/html/_images/logo_inrae.jpg

22.4 KB

public/html/_images/logo_ohmpi.JPG

11.6 KB

public/html/_images/logo_univ_gustave.png

69.6 KB

public/html/_images/measurement_board-2.jpg

205 KB

public/html/_images/measurement_board.jpg

466 KB

public/html/_images/multiplexer_implementation.jpg

312 KB

public/html/_images/schema_measurement_board.jpg

98.7 KB

.. Ohmpi documentation master file, created by
sphinx-quickstart on Tue Jun 30 20:22:03 2020.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
OHMPI: Open source and open hardware resitivity-meter
=====================================================
.. sidebar:: Summary
:Release: |release|
:Date: |today|
:Authors: **Rémi CLEMENT, Nicolas FORQUET, Julien GANCE, Yannick FARGIER, Vivien DUBOIS, Hélène GUYARD**
:Target: users, researchers and developers
:status: some mature, some in progress
.. topic:: OhmPi Document Center
* OhmPi offcial documents
* Release guidelines
* General tutorials
.. image:: logo_ohmpi.JPG
:width: 200px
:height: 150px
:align: center
Contents:
.. toctree::
:maxdepth: 2
page0
page1
************
Premiere page
*************
**OhmPi project**
*************************
.. image:: logo_ohmpi.JPG
:width: 350 px
:align: center
:height: 250 px
:alt: Logo OhmPi
Authors:
| Rémi CLEMENT,Vivien DUBOIS,Nicolas Forquet, INRAE, REVERSAAL, F-69626, Villeurbanne Cedex, France.
| Yannick FARGIER, GERS-RRO, Univ Gustave Eiffel, IFSTTAR, Univ Lyon, F-69675 Lyon, France.
| Julien GANCE, IRIS Instruments, 45100 Orléans, France.
| Hélène GUYARD, IGE Grenoble, Université Grenoble Alpes, Grenoble.
Parteners:
.. table::
:align: center
+-------------------------------+-----------------------------------+-------------------------------+-----------------------------------+
| .. image:: logo_inrae.jpg | .. image:: logo_univ_gustave.png | .. image:: logo-iris.jpg | .. image:: ige.png |
+-------------------------------+-----------------------------------+-------------------------------+-----------------------------------+
Creation date : Juillet 2020.
Update : 21 août 2020.
Status of document: In progress.
**Introduction to OhmPi**
=========================
This documentation presents the development of a low-cost, open hardware \
resistivity meter to provide the scientific community with a robust \
and flexible tool for small-scale experiments. Called OhmPi, this basic resistivity meter\
features current injection and measurement functions associated with a multiplexer \
that allows performing automatic measurements with up to 32 electrodes.\
OhmPi's philosophy is to provide a fully open source and open hardware tool /
to the near surface scientific community.
.. note::
Everyone willing to get involved is welcome in ohmPi Project!.
\ No newline at end of file
*****************************************
OhmPi V 1.01 (limited to 32 electrodes)
*****************************************
The philosophy of Ohmpi
**************************
The philosophy of Ohmpi V1.01 is to offer a multi electrode resistivity meter, from a set of commercially available
electronic cards it is a resistivity meter limited to 32 electrodes only. It is limited to low-current injection,
but suitable for small laboratory experiments and small field time monitoring
Technical data
***************
+-------------------------------+--------------------+-----------+
| **Parameter** | **Specifications** | Units |
+-------------------------------+--------------------+-----------+
|Electrodes |32 | |
+-------------------------------+--------------------+-----------+
|Operating temperature |0 to 50 |°c |
+-------------------------------+--------------------+-----------+
|Power consumption of CPU and |18.5 |W |
|control system | | |
+-------------------------------+--------------------+-----------+
|Voltage injection |12 |V |
+-------------------------------+--------------------+-----------+
|Battery |12 |V |
+-------------------------------+--------------------+-----------+
|Current |0 to 50 |mA |
+-------------------------------+--------------------+-----------+
|Min pulse duration |150 |mS |
+-------------------------------+--------------------+-----------+
|Input impedance |36 |Mohm |
+-------------------------------+--------------------+-----------+
|Data storage |micro SD card | |
+-------------------------------+--------------------+-----------+
|Resolution |O.O1 |ohm |
+-------------------------------+--------------------+-----------+
OS installation on a Raspberry Pi
******************************************
The first step is to start up the Raspberry Pi board, including installation of an OS (operating system).
For this step, the installation instructions are well described on the Raspberry website
https://www.raspberrypi.org/help/noobs-setup/2/). The authors recommend installing the latest
stable and complete version of Raspbian by using NOOBS (a simple-to-use operating system installer).
Once the OS has been installed, the 1-wire option and GPIO remote option must be deactivated via the
Raspbian GUI settings menu. Failure to carry out this task may cause damage to the relay shield cards during measurements.
Construction of the measurement board and connection to the Raspberry
**************************************************************************
Electrical resistivity measurements
===================================
To measure electrical resistivity with Raspberry Pi, an ADS1115 was introduced, as proposed by Florsch [7]. The ADS1115
is a 16-bit ADC (Analog-to-Digital Converter), with an adaptable gain. Its value has been set at 1 in this study. The
input signal value could lie between - to + 6.114 V. The ADS1115 is mounted on a board adapted from an in-house design.
Figure 5 shows the general diagram for the electronic measurement board developed. This figure also displays the test
circuit used to test the board in the laboratory, which mimics the behavior of a soil subjected to current injection.
In this test circuit, resistance R11 represents the soil resistance.
Soil resistance R11 is connected to electrodes A and B for the current injection. Resistors R10 and R12 constitute
the contact resistances between soil and electrodes; they are typically made of stainless steel. The battery, which
allows for direct current injection, is connected in series with resistors R10, R11 and R12. In this part of the board,
resistance R9 has been added to measure the current flowing between electrodes A and B. This resistance value has been
set at 50 ohms in order to ensure:
• a precise resistance,
• a resistance less than the sum of resistors R10, R11 and R12; indeed, R10 and R12 generally lie between 100 and 5,000 ohms.
To measure the current intensity between A and B, the electrical potential difference at the pole of the reference resistor (R9)
is measured. The intensity (in mA) is calculated by inserting the resulting value into the following: ?
To measure the potential difference needed to measure current intensity, the ADS 1115 is connected to the ground of the circuit.
In our case, the ground reference is electrode B. The analog inputs A1 and A0 of the ADS1115 are connected to each pole of the
reference resistor (R9). In order to increase input impedance and adapt the signal gain, tracking amplifiers have been included
and completed by a divider bridge (R5, R8, R6 and R7) located between the two amplifiers. The resistance of the divider bridge
ensures that the signal remains between 0 and 5 V, in accordance with the ADS1115 signal gain. To measure the potential difference,
the M and N electrodes are connected to analog inputs A2 and A3 of the ADS 1115. Between the ADC and the electrodes, two tracking
amplifiers and a divider bridge have been positioned so as to obtain a potential lying within the 0-5 V range at the analog input of the ADS 1115.
Let's note that the potential difference value would equal the potential measured with ADS1115 multiplied by the voltage reduction
value of the divider bridge (see Section 5.2). Despite the use of high-resolution resistance (i.e. accurate to within 1%), it is
still necessary to calibrate the divider bridge using a precision voltmeter. For this purpose, the input and output potentials
of the divider bridge must be measured using an equivalent circuit for various electrical potential values. These values serve
to calculate the gain. With this electronic board, it is possible to measure the potential and intensity without disturbing the
electric field in the ground, with the total input impedance value being estimated at 36 mega-ohms.
A shortcut between Electrodes A and B will generate excessive currents, whose intensities depend on the type of battery used.
A lithium ion battery or automobile-type lead-acid battery can deliver a strong enough current to damage the board and, as such,
constitutes a potential hazard. We therefore recommend adding a 1.5-A fuse between the battery and resistor R9.
.. figure:: schema_measurement_board.jpg
:width: 800px
:align: center
:height: 400px
:alt: alternate text
:figclass: align-center
Measurement board
Implementation
==============
The measurement board must be printed using the PCB file (Source file repository), with components soldered onto
it by following the steps described below and illustrated in the following figure :
* Step no. 1: installation of the 1-Kohm resistors with an accuracy of ± 1%.
* Step no. 2: installation of the 1.5-Kohm resistors with an accuracy of ± 1%.
* Step no. 3: installation of both the black female 1 x 10 header and the 7-blue screw terminal blocks
* Step no. 4: installation of the 50-Ohm reference resistor ± 0.1%
* Step no. 5: addition of both the ADS115 directly onto the header (pins must be plugged according to the figure) and the LM358N operational amplifiers (pay attention to the direction).
1-Kohm and 1.5-Kohm resistors apply to the divider bridge. If, for example, you prefer using a weaker
or stronger power supply, it would be possible to adjust the divider bridge value by simply modifying these resistors.
Once all the components have been soldered together, the measurement board can be connected to the Raspberry Pi and the
battery terminal, according to Figure 9. Between the battery and the TX+ terminal of the measurement board, remember to
place a fuse holder with a 1.5-A fuse for safety purposes.
.. figure:: measurement_board.jpg
:width: 800px
:align: center
:height: 400px
:alt: alternate text
:figclass: align-center
Measurement circuit board assembly: a) printed circuit board, b) adding the 1-Kohm resistors ± 1%, c)adding the 1.5-Kohm resistors ± 1%, d) adding the black female 1 x 10 header and the 7-blue screw terminal block(2 pin, 3.5-mm pitch), e) adding the 50-ohm reference resistor ± 0.1%, and f) adding the ADS1115 and the LM358N low-power dual operational amplifiers
.. figure:: measurement_board-2.jpg
:width: 800px
:align: center
:height: 700px
:alt: alternate text
:figclass: align-center
Measurement board installation with Raspberry Pi
Current injection
******************
To carry out the electrical resistivity measurement, the first step consists of injecting current into the ground.
In our case, a simple 12-V lead-acid battery is used to create an electrical potential difference that results
in current circulating into the ground. The current is injected through electrodes A and B (see Fig. 2). This
injection is controlled via a 4-channel relay module board connected to the Raspberry Pi. The mechanical relay
module board is shown in Figure 4. Relays 1 and 2 serve to switch on the current source. The common contacts
of relays 1 and 2 are connected to the positive and negative battery poles, respectively. The normally open
contacts of both relays are connected to the common contacts of relays 3 and 4. Relays 1 and 2 are connected
to the GPIO 7 on the Raspberry Pi and therefore activate simultaneously. The role of relays 3 and 4 is to reverse
the polarity at electrodes A and B. Thus, when relays 3 and 4 are energized by the GPIO 8 in the open position,
the positive battery pole is connected to electrode A and the negative pole to electrode B. When not energized,
they remain in the normally closed position. This set-up offers a simple and robust solution to inject current.
.. figure:: current_board.jpg
:width: 800px
:align: center
:height: 400px
:alt: alternate text
:figclass: align-center
Wiring of the 4-channel relay module board for current injection management
Multiplexer implentation
*************************
The resistivity measurement is conducted on four terminals (A, B, M and N). The user could perform each measurement
by manually plugging four electrodes into the four channel terminals. In practice, ERT requires several tens or thousands
of measurements conducted on different electrode arrays. A multiplexer is therefore used to connect each channel to one of
the 32 electrodes stuck into the ground, all of which are connected to the data logger.
We will describe below how to assemble the four multiplexers (MUX), one per terminal. A multiplexer consists of 2 relay
modules with 16 channels each. On the first board, on each MUX, 15 relays out of the 16 available will be used. Please note that the suggested
configuration enables making smaller multiplexers (8 or 16 electrodes only). On the other hand, if you prefer upping to 64 electrodes,
which is entirely possible, a GPIO channel multiplier will have to be used.
To prepare the multiplexer, the channels of the two relay boards must be connected according to the wiring diagram shown below.
.. figure:: multiplexer_implementation.jpg
:width: 800px
:align: center
:height: 400px
:alt: alternate text
:figclass: align-center
Schematic diagram of the wiring of two 16-channel relay shields
For this purpose, 0.5-mm² cables with end caps are used and their length adjusted for each connection in order to produce a clean assembly.
The length was adjusted so that the distance between the two points to be connected could be directly measured on the board once they had
been assembled one above the other, in adding an extra 3 cm. The wires at the ends need to be stripped and the end caps added.
As a final step, connect the cables to the correct connectors. This operation must be repeated in order to carry out all the wiring shown in Figure below.
Once the operation has been completed, the 16 control pins of each 16-channel relay shield card must be prepared. Each card actually contains 16 input channels
for activating each relay (Fig. 12). However, we will be activating several relays with a single GPIO (to limit the number of GPIOs used on Raspberry Pi,
see Section 2.4). To execute this step, it will be necessary to follow the protocol presented in Figure.
.. figure:: connection.jpg
:width: 800px
:align: center
:height: 400px
:alt: alternate text
:figclass: align-center
Connection to the 16-channel relay shield
For the 16-channel relay shield no. 1, these steps must be followed:
* Position a test circuit with 10 horizontal and 10 vertical holes on the pins of the 16-channel relay shield board.
* Follow the diagram and solder the pins as shown in Fig.
* Lastly, solder 0.5-mm² wires 1 m in length to the test circuit.
For relay shield no. 2, follow the same procedure, but solder all the pins together (d-e-f).
This same operation must be repeated for the other three multiplexers as well.
The next step consists of connecting the relay card inputs to the Raspberry Pi according to Table 5 for all four multiplexers.
+-------------------------------+-------------------------------------------+---------------------+
| |Relay shield n°1 |Relay Shield n°2 |
| +----------+----------+----------+----------+---------------------+
| |Pin 1 |Pin 2-3 |Pin 4-7 |Pin 8-16 |Pin 1- 16 |
+-------------------------------+----------+----------+----------+----------+---------------------+
| Multiplexer A |12 |16 |20 |21 |26 |
+-------------------------------+----------+----------+----------+----------+---------------------+
| Multiplexer B |18 |23 |24 |25 |19 |
+-------------------------------+----------+----------+----------+----------+---------------------+
| Multiplexer M |06 |13 |04 |17 |27 |
+-------------------------------+----------+----------+----------+----------+---------------------+
| Multiplexer N |22 |10 |09 |11 |05 |
+-------------------------------+----------+----------+----------+----------+---------------------+
Connection of the GPIOs to each multiplexer
Electrode connection
*************************
At this point, all that remains is to connect the electrodes of each multiplexer to a terminal block (Fig. 13). In our set-up, screw terminals assembled on a din rail were used.
According to the chosen multiplexer configuration, all the relays of each multiplexer will be connected to an electrode and, consequently, each electrode will have four incoming
connections. Instead of having four cables connecting an electrode terminal to each multiplexer, we recommend using the cable assembly shown in the following Figure.
.. figure:: cable.jpg
:width: 800px
:align: center
:height: 300px
:alt: alternate text
:figclass: align-center
the next figure provides an example of multiplexer relay connections for electrode no. 1: this electrode of multiplexer MUX A must be connected to electrode no. 1 of MUX B. Moreover, electrode no. 1 of MUX B
must be connected to electrode no. 1 of MUX N, which in turn must be connected to electrode no. 1 of MUX M. Lastly, electrode no. 1 of MUX M is connected to the terminal block.
This operation must be repeated for all 32 electrodes.
.. figure:: electrode_cable.jpg
:width: 800px
:align: center
:height: 800px
:alt: alternate text
:figclass: align-center
Operating instruction
*************************
Preliminary procedure (Only for the initial operation)
======================================================
The open source code must be downloaded at the Open Science Framework source file repository for this manuscript (https://osf.io/dzwb4/)
or at the following Gitlab repository address: https://gitlab.irstea.fr/reversaal/OhmPi. The code must be then unzipped into a selected folder (e.g. OhmPi-master). A “readme” file
is proposed in the directory to assist with installation of the software and required python packages. It is strongly recommended to create a python virtual environment for installing
the required packages and running the code.
Startup procedure
==================
As an initial operating instruction, the 12-V battery must be disconnected before any hardware handling. Ensure that the battery is charged at full capacity. Plug all the electrodes (32 or fewer)
into the screw terminals. The Raspberry Pi must be plugged into a computer screen, with a mouse and keyboard accessed remotely. The Raspberry Pi must then be plugged into the power supply
(for laboratory measurements) or a power bank (5V - 2A for field measurements). At this point, you'll need to access the Raspbian operating system. Inside the previously created folder “ohmPi”,
the protocol file “ABMN.txt” must be created or modified; this file contains all quadrupole ABMN numeration (an example is proposed with the source code). Some input parameters of the main “ohmpi.py”
function may be adjusted/optimized depending on the measurement attributes. For example, both the current injection duration and number of stacks can be adjusted. At this point, the 12-V battery can be
plugged into the hardware; the "ohmpi.py" source code must be run within a python3 environment (or a virtual environment if one has been created) either in the terminal or using Thonny. You should now
hear the characteristic sound of a relay switching as a result of electrode permutation. After each quadrupole measurement, the potential difference as well as the current intensity and resistance
are displayed on the screen. A measurement file is automatically created and named "measure.csv"; it will be placed in the same folder.
Electrical resistivity measurement parameters description
==========================================================
.. code-block:: python
:linenos:
:lineno-start: 27
"""
measurement parameters
"""
nb_electrodes = 32 # maximum number of electrodes on the resistivity meter
injection_duration = 0.5 # Current injection duration in second
nbr_meas= 1 # Number of times the quadripole sequence is repeated
sequence_delay= 30 # Delay in seconds between 2 sequences
stack= 1 # repetition of the current injection for each quadripole
The measurement parameters can be adjusted in lines 27 to 30 of the ohmpi.py code.
public/html/_static/background_b01.png

78 Bytes

/*
* basic.css
* ~~~~~~~~~
*
* Sphinx stylesheet -- basic theme.
*
* :copyright: Copyright 2007-2020 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
/* -- main layout ----------------------------------------------------------- */
div.clearer {
clear: both;
}
/* -- relbar ---------------------------------------------------------------- */
div.related {
width: 100%;
font-size: 90%;
}
div.related h3 {
display: none;
}
div.related ul {
margin: 0;
padding: 0 0 0 10px;
list-style: none;
}
div.related li {
display: inline;
}
div.related li.right {
float: right;
margin-right: 5px;
}
/* -- sidebar --------------------------------------------------------------- */
div.sphinxsidebarwrapper {
padding: 10px 5px 0 10px;
}
div.sphinxsidebar {
float: left;
width: 230px;
margin-left: -100%;
font-size: 90%;
word-wrap: break-word;
overflow-wrap : break-word;
}
div.sphinxsidebar ul {
list-style: none;
}
div.sphinxsidebar ul ul,
div.sphinxsidebar ul.want-points {
margin-left: 20px;
list-style: square;
}
div.sphinxsidebar ul ul {
margin-top: 0;
margin-bottom: 0;
}
div.sphinxsidebar form {
margin-top: 10px;
}
div.sphinxsidebar input {
border: 1px solid #98dbcc;
font-family: sans-serif;
font-size: 1em;
}
div.sphinxsidebar #searchbox form.search {
overflow: hidden;
}
div.sphinxsidebar #searchbox input[type="text"] {
float: left;
width: 80%;
padding: 0.25em;
box-sizing: border-box;
}
div.sphinxsidebar #searchbox input[type="submit"] {
float: left;
width: 20%;
border-left: none;
padding: 0.25em;
box-sizing: border-box;
}
img {
border: 0;
max-width: 100%;
}
/* -- search page ----------------------------------------------------------- */
ul.search {
margin: 10px 0 0 20px;
padding: 0;
}
ul.search li {
padding: 5px 0 5px 20px;
background-image: url(file.png);
background-repeat: no-repeat;
background-position: 0 7px;
}
ul.search li a {
font-weight: bold;
}
ul.search li div.context {
color: #888;
margin: 2px 0 0 30px;
text-align: left;
}
ul.keywordmatches li.goodmatch a {
font-weight: bold;
}
/* -- index page ------------------------------------------------------------ */
table.contentstable {
width: 90%;
margin-left: auto;
margin-right: auto;
}
table.contentstable p.biglink {
line-height: 150%;
}
a.biglink {
font-size: 1.3em;
}
span.linkdescr {
font-style: italic;
padding-top: 5px;
font-size: 90%;
}
/* -- general index --------------------------------------------------------- */
table.indextable {
width: 100%;
}
table.indextable td {
text-align: left;
vertical-align: top;
}
table.indextable ul {
margin-top: 0;
margin-bottom: 0;
list-style-type: none;
}
table.indextable > tbody > tr > td > ul {
padding-left: 0em;
}
table.indextable tr.pcap {
height: 10px;
}
table.indextable tr.cap {
margin-top: 10px;
background-color: #f2f2f2;
}
img.toggler {
margin-right: 3px;
margin-top: 3px;
cursor: pointer;
}
div.modindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
div.genindex-jumpbox {
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
margin: 1em 0 1em 0;
padding: 0.4em;
}
/* -- domain module index --------------------------------------------------- */
table.modindextable td {
padding: 2px;
border-collapse: collapse;
}
/* -- general body styles --------------------------------------------------- */
div.body {
min-width: 450px;
max-width: 800px;
}
div.body p, div.body dd, div.body li, div.body blockquote {
-moz-hyphens: auto;
-ms-hyphens: auto;
-webkit-hyphens: auto;
hyphens: auto;
}
a.headerlink {
visibility: hidden;
}
a.brackets:before,
span.brackets > a:before{
content: "[";
}
a.brackets:after,
span.brackets > a:after {
content: "]";
}
h1:hover > a.headerlink,
h2:hover > a.headerlink,
h3:hover > a.headerlink,
h4:hover > a.headerlink,
h5:hover > a.headerlink,
h6:hover > a.headerlink,
dt:hover > a.headerlink,
caption:hover > a.headerlink,
p.caption:hover > a.headerlink,
div.code-block-caption:hover > a.headerlink {
visibility: visible;
}
div.body p.caption {
text-align: inherit;
}
div.body td {
text-align: left;
}
.first {
margin-top: 0 !important;
}
p.rubric {
margin-top: 30px;
font-weight: bold;
}
img.align-left, .figure.align-left, object.align-left {
clear: left;
float: left;
margin-right: 1em;
}
img.align-right, .figure.align-right, object.align-right {
clear: right;
float: right;
margin-left: 1em;
}
img.align-center, .figure.align-center, object.align-center {
display: block;
margin-left: auto;
margin-right: auto;
}
img.align-default, .figure.align-default {
display: block;
margin-left: auto;
margin-right: auto;
}
.align-left {
text-align: left;
}
.align-center {
text-align: center;
}
.align-default {
text-align: center;
}
.align-right {
text-align: right;
}
/* -- sidebars -------------------------------------------------------------- */
div.sidebar {
margin: 0 0 0.5em 1em;
border: 1px solid #ddb;
padding: 7px;
background-color: #ffe;
width: 40%;
float: right;
clear: right;
overflow-x: auto;
}
p.sidebar-title {
font-weight: bold;
}
div.admonition, div.topic, pre, div[class|="highlight"] {
clear: both;
}
/* -- topics ---------------------------------------------------------------- */
div.topic {
border: 1px solid #ccc;
padding: 7px;
margin: 10px 0 10px 0;
overflow-x: auto;
}
p.topic-title {
font-size: 1.1em;
font-weight: bold;
margin-top: 10px;
}
/* -- admonitions ----------------------------------------------------------- */
div.admonition {
margin-top: 10px;
margin-bottom: 10px;
padding: 7px;
overflow-x: auto;
}
div.admonition dt {
font-weight: bold;
}
p.admonition-title {
margin: 0px 10px 5px 0px;
font-weight: bold;
}
div.body p.centered {
text-align: center;
margin-top: 25px;
}
/* -- content of sidebars/topics/admonitions -------------------------------- */
div.sidebar > :last-child,
div.topic > :last-child,
div.admonition > :last-child {
margin-bottom: 0;
}
/* -- tables ---------------------------------------------------------------- */
table.docutils {
margin-top: 10px;
margin-bottom: 10px;
border: 0;
border-collapse: collapse;
}
table.align-center {
margin-left: auto;
margin-right: auto;
}
table.align-default {
margin-left: auto;
margin-right: auto;
}
table caption span.caption-number {
font-style: italic;
}
table caption span.caption-text {
}
table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 0;
border-bottom: 1px solid #aaa;
}
table.footnote td, table.footnote th {
border: 0 !important;
}
th {
text-align: left;
padding-right: 5px;
}
table.citation {
border-left: solid 1px gray;
margin-left: 1px;
}
table.citation td {
border-bottom: none;
}
th > :first-child,
td > :first-child {
margin-top: 0px;
}
th > :last-child,
td > :last-child {
margin-bottom: 0px;
}
/* -- figures --------------------------------------------------------------- */
div.figure {
margin: 0.5em;
padding: 0.5em;
}
div.figure p.caption {
padding: 0.3em;
}
div.figure p.caption span.caption-number {
font-style: italic;
}
div.figure p.caption span.caption-text {
}
/* -- field list styles ----------------------------------------------------- */
table.field-list td, table.field-list th {
border: 0 !important;
}
.field-list ul {
margin: 0;
padding-left: 1em;
}
.field-list p {
margin: 0;
}
.field-name {
-moz-hyphens: manual;
-ms-hyphens: manual;
-webkit-hyphens: manual;
hyphens: manual;
}
/* -- hlist styles ---------------------------------------------------------- */
table.hlist {
margin: 1em 0;
}
table.hlist td {
vertical-align: top;
}
/* -- other body styles ----------------------------------------------------- */
ol.arabic {
list-style: decimal;
}
ol.loweralpha {
list-style: lower-alpha;
}
ol.upperalpha {
list-style: upper-alpha;
}
ol.lowerroman {
list-style: lower-roman;
}
ol.upperroman {
list-style: upper-roman;
}
ol > li:first-child > :first-child,
ul > li:first-child > :first-child {
margin-top: 0px;
}
ol ol > li:first-child > :first-child,
ol ul > li:first-child > :first-child,
ul ol > li:first-child > :first-child,
ul ul > li:first-child > :first-child {
margin-top: revert;
}
ol > li:last-child > :last-child,
ul > li:last-child > :last-child {
margin-bottom: 0px;
}
ol ol > li:last-child > :last-child,
ol ul > li:last-child > :last-child,
ul ol > li:last-child > :last-child,
ul ul > li:last-child > :last-child {
margin-bottom: revert;
}
dl.footnote > dt,
dl.citation > dt {
float: left;
margin-right: 0.5em;
}
dl.footnote > dd,
dl.citation > dd {
margin-bottom: 0em;
}
dl.footnote > dd:after,
dl.citation > dd:after {
content: "";
clear: both;
}
dl.field-list {
display: grid;
grid-template-columns: fit-content(30%) auto;
}
dl.field-list > dt {
font-weight: bold;
word-break: break-word;
padding-left: 0.5em;
padding-right: 5px;
}
dl.field-list > dt:after {
content: ":";
}
dl.field-list > dd {
padding-left: 0.5em;
margin-top: 0em;
margin-left: 0em;
margin-bottom: 0em;
}
dl {
margin-bottom: 15px;
}
dd > :first-child {
margin-top: 0px;
}
dd ul, dd table {
margin-bottom: 10px;
}
dd {
margin-top: 3px;
margin-bottom: 10px;
margin-left: 30px;
}
dl > dd:last-child,
dl > dd:last-child > :last-child {
margin-bottom: 0;
}
dt:target, span.highlighted {
background-color: #fbe54e;
}
rect.highlighted {
fill: #fbe54e;
}
dl.glossary dt {
font-weight: bold;
font-size: 1.1em;
}
.optional {
font-size: 1.3em;
}
.sig-paren {
font-size: larger;
}
.versionmodified {
font-style: italic;
}
.system-message {
background-color: #fda;
padding: 5px;
border: 3px solid red;
}
.footnote:target {
background-color: #ffa;
}
.line-block {
display: block;
margin-top: 1em;
margin-bottom: 1em;
}
.line-block .line-block {
margin-top: 0;
margin-bottom: 0;
margin-left: 1.5em;
}
.guilabel, .menuselection {
font-family: sans-serif;
}
.accelerator {
text-decoration: underline;
}
.classifier {
font-style: oblique;
}
.classifier:before {
font-style: normal;
margin: 0.5em;
content: ":";
}
abbr, acronym {
border-bottom: dotted 1px;
cursor: help;
}
/* -- code displays --------------------------------------------------------- */
pre {
overflow: auto;
overflow-y: hidden; /* fixes display issues on Chrome browsers */
}
span.pre {
-moz-hyphens: none;
-ms-hyphens: none;
-webkit-hyphens: none;
hyphens: none;
}
div[class^="highlight-"] {
margin: 1em 0;
}
td.linenos pre {
border: 0;
background-color: transparent;
color: #aaa;
}
table.highlighttable {
display: block;
}
table.highlighttable tbody {
display: block;
}
table.highlighttable tr {
display: flex;
}
table.highlighttable td {
margin: 0;
padding: 0;
}
table.highlighttable td.linenos {
padding-right: 0.5em;
}
table.highlighttable td.code {
flex: 1;
overflow: hidden;
}
.highlight .hll {
display: block;
}
div.highlight pre,
table.highlighttable pre {
margin: 0;
}
div.code-block-caption + div {
margin-top: 0;
}
div.code-block-caption {
margin-top: 1em;
padding: 2px 5px;
font-size: small;
}
div.code-block-caption code {
background-color: transparent;
}
table.highlighttable td.linenos,
div.doctest > div.highlight span.gp { /* gp: Generic.Prompt */
user-select: none;
}
div.code-block-caption span.caption-number {
padding: 0.1em 0.3em;
font-style: italic;
}
div.code-block-caption span.caption-text {
}
div.literal-block-wrapper {
margin: 1em 0;
}
code.descname {
background-color: transparent;
font-weight: bold;
font-size: 1.2em;
}
code.descclassname {
background-color: transparent;
}
code.xref, a code {
background-color: transparent;
font-weight: bold;
}
h1 code, h2 code, h3 code, h4 code, h5 code, h6 code {
background-color: transparent;
}
.viewcode-link {
float: right;
}
.viewcode-back {
float: right;
font-family: sans-serif;
}
div.viewcode-block:target {
margin: -1px -10px;
padding: 0 10px;
}
/* -- math display ---------------------------------------------------------- */
img.math {
vertical-align: middle;
}
div.body div.math p {
text-align: center;
}
span.eqno {
float: right;
}
span.eqno a.headerlink {
position: absolute;
z-index: 1;
}
div.math:hover a.headerlink {
visibility: visible;
}
/* -- printout stylesheet --------------------------------------------------- */
@media print {
div.document,
div.documentwrapper,
div.bodywrapper {
margin: 0 !important;
width: 100%;
}
div.sphinxsidebar,
div.related,
div.footer,
#top-link {
display: none;
}
}
\ No newline at end of file
/*
* bizstyle.css_t
* ~~~~~~~~~~~~~~
*
* Sphinx stylesheet -- business style theme.
*
* :copyright: Copyright 2011-2014 by Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
@import url("basic.css");
/* -- page layout ----------------------------------------------------------- */
body {
font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
'Verdana', sans-serif;
font-size: 14px;
letter-spacing: -0.01em;
line-height: 150%;
text-align: center;
background-color: white;
background-image: url(background_b01.png);
color: black;
padding: 0;
border-right: 1px solid #336699;
border-left: 1px solid #336699;
margin: 0px 40px 0px 40px;
}
div.document {
background-color: white;
text-align: left;
background-repeat: repeat-x;
-moz-box-shadow: 2px 2px 5px #000;
-webkit-box-shadow: 2px 2px 5px #000;
}
div.documentwrapper {
float: left;
width: 100%;
}
div.bodywrapper {
margin: 0 0 0 240px;
border-left: 1px solid #ccc;
}
div.body {
margin: 0;
padding: 0.5em 20px 20px 20px;
}
div.bodywrapper {
margin: 0 0 0 calc(210px + 30px);
}
div.related {
font-size: 1em;
-moz-box-shadow: 2px 2px 5px #000;
-webkit-box-shadow: 2px 2px 5px #000;
}
div.related ul {
background-color: #336699;
height: 100%;
overflow: hidden;
border-top: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
div.related ul li {
color: white;
margin: 0;
padding: 0;
height: 2em;
float: left;
}
div.related ul li.right {
float: right;
margin-right: 5px;
}
div.related ul li a {
margin: 0;
padding: 0 5px 0 5px;
line-height: 1.75em;
color: #fff;
}
div.related ul li a:hover {
color: #fff;
text-decoration: underline;
}
div.sphinxsidebarwrapper {
padding: 0;
}
div.sphinxsidebar {
padding: 0.5em 12px 12px 12px;
width: 210px;
font-size: 1em;
text-align: left;
}
div.sphinxsidebar h3, div.sphinxsidebar h4 {
margin: 1em 0 0.5em 0;
font-size: 1em;
padding: 0.1em 0 0.1em 0.5em;
color: white;
border: 1px solid #336699;
background-color: #336699;
}
div.sphinxsidebar h3 a {
color: white;
}
div.sphinxsidebar ul {
padding-left: 1.5em;
margin-top: 7px;
padding: 0;
line-height: 130%;
}
div.sphinxsidebar ul ul {
margin-left: 20px;
}
div.sphinxsidebar input {
border: 1px solid #336699;
}
div.footer {
background-color: white;
color: #336699;
padding: 3px 8px 3px 0;
clear: both;
font-size: 0.8em;
text-align: right;
border-bottom: 1px solid #336699;
-moz-box-shadow: 2px 2px 5px #000;
-webkit-box-shadow: 2px 2px 5px #000;
}
div.footer a {
color: #336699;
text-decoration: underline;
}
/* -- body styles ----------------------------------------------------------- */
p {
margin: 0.8em 0 0.5em 0;
}
a {
color: #336699;
text-decoration: none;
}
a:hover {
color: #336699;
text-decoration: underline;
}
div.body a {
text-decoration: underline;
}
h1, h2, h3 {
color: #336699;
}
h1 {
margin: 0;
padding: 0.7em 0 0.3em 0;
font-size: 1.5em;
}
h2 {
margin: 1.3em 0 0.2em 0;
font-size: 1.35em;
padding-bottom: .5em;
border-bottom: 1px solid #336699;
}
h3 {
margin: 1em 0 -0.3em 0;
font-size: 1.2em;
padding-bottom: .3em;
border-bottom: 1px solid #CCCCCC;
}
div.body h1 a, div.body h2 a, div.body h3 a,
div.body h4 a, div.body h5 a, div.body h6 a {
color: black!important;
}
h1 a.anchor, h2 a.anchor, h3 a.anchor,
h4 a.anchor, h5 a.anchor, h6 a.anchor {
display: none;
margin: 0 0 0 0.3em;
padding: 0 0.2em 0 0.2em;
color: #aaa!important;
}
h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor,
h5:hover a.anchor, h6:hover a.anchor {
display: inline;
}
h1 a.anchor:hover, h2 a.anchor:hover, h3 a.anchor:hover, h4 a.anchor:hover,
h5 a.anchor:hover, h6 a.anchor:hover {
color: #777;
background-color: #eee;
}
a.headerlink {
color: #c60f0f!important;
font-size: 1em;
margin-left: 6px;
padding: 0 4px 0 4px;
text-decoration: none!important;
}
a.headerlink:hover {
background-color: #ccc;
color: white!important;
}
cite, code, tt {
font-family: 'Consolas', 'Deja Vu Sans Mono',
'Bitstream Vera Sans Mono', monospace;
font-size: 0.95em;
letter-spacing: 0.01em;
}
code {
background-color: #F2F2F2;
border-bottom: 1px solid #ddd;
color: #333;
}
code.descname, code.descclassname, code.xref {
border: 0;
}
hr {
border: 1px solid #abc;
margin: 2em;
}
a code {
border: 0;
color: #CA7900;
}
a code:hover {
color: #2491CF;
}
pre {
background-color: transparent !important;
font-family: 'Consolas', 'Deja Vu Sans Mono',
'Bitstream Vera Sans Mono', monospace;
font-size: 0.95em;
letter-spacing: 0.015em;
line-height: 120%;
padding: 0.5em;
border-right: 5px solid #ccc;
border-left: 5px solid #ccc;
}
pre a {
color: inherit;
text-decoration: underline;
}
td.linenos pre {
padding: 0.5em 0;
}
div.quotebar {
background-color: #f8f8f8;
max-width: 250px;
float: right;
padding: 2px 7px;
border: 1px solid #ccc;
}
div.topic {
background-color: #f8f8f8;
}
table {
border-collapse: collapse;
margin: 0 -0.5em 0 -0.5em;
}
table td, table th {
padding: 0.2em 0.5em 0.2em 0.5em;
}
div.admonition {
font-size: 0.9em;
margin: 1em 0 1em 0;
border: 3px solid #cccccc;
background-color: #f7f7f7;
padding: 0;
}
div.admonition p {
margin: 0.5em 1em 0.5em 1em;
padding: 0;
}
div.admonition li p {
margin-left: 0;
}
div.admonition pre, div.warning pre {
margin: 0;
}
div.highlight {
margin: 0.4em 1em;
}
div.admonition p.admonition-title {
margin: 0;
padding: 0.1em 0 0.1em 0.5em;
color: white;
border-bottom: 3px solid #cccccc;
font-weight: bold;
background-color: #165e83;
}
div.danger { border: 3px solid #f0908d; background-color: #f0cfa0; }
div.error { border: 3px solid #f0908d; background-color: #ede4cd; }
div.warning { border: 3px solid #f8b862; background-color: #f0cfa0; }
div.caution { border: 3px solid #f8b862; background-color: #ede4cd; }
div.attention { border: 3px solid #f8b862; background-color: #f3f3f3; }
div.important { border: 3px solid #f0cfa0; background-color: #ede4cd; }
div.note { border: 3px solid #f0cfa0; background-color: #f3f3f3; }
div.hint { border: 3px solid #bed2c3; background-color: #f3f3f3; }
div.tip { border: 3px solid #bed2c3; background-color: #f3f3f3; }
div.danger p.admonition-title, div.error p.admonition-title {
background-color: #b7282e;
border-bottom: 3px solid #f0908d;
}
div.caution p.admonition-title,
div.warning p.admonition-title,
div.attention p.admonition-title {
background-color: #f19072;
border-bottom: 3px solid #f8b862;
}
div.note p.admonition-title, div.important p.admonition-title {
background-color: #f8b862;
border-bottom: 3px solid #f0cfa0;
}
div.hint p.admonition-title, div.tip p.admonition-title {
background-color: #7ebea5;
border-bottom: 3px solid #bed2c3;
}
div.admonition ul, div.admonition ol,
div.warning ul, div.warning ol {
margin: 0.1em 0.5em 0.5em 3em;
padding: 0;
}
div.versioninfo {
margin: 1em 0 0 0;
border: 1px solid #ccc;
background-color: #DDEAF0;
padding: 8px;
line-height: 1.3em;
font-size: 0.9em;
}
.viewcode-back {
font-family: 'Lucida Grande', 'Lucida Sans Unicode', 'Geneva',
'Verdana', sans-serif;
}
div.viewcode-block:target {
background-color: #f4debf;
border-top: 1px solid #ac9;
border-bottom: 1px solid #ac9;
}
p.versionchanged span.versionmodified {
font-size: 0.9em;
margin-right: 0.2em;
padding: 0.1em;
background-color: #DCE6A0;
}
dl.field-list > dt {
color: white;
background-color: #82A0BE;
}
dl.field-list > dd {
background-color: #f7f7f7;
}
/* -- table styles ---------------------------------------------------------- */
table.docutils {
margin: 1em 0;
padding: 0;
border: 1px solid white;
background-color: #f7f7f7;
}
table.docutils td, table.docutils th {
padding: 1px 8px 1px 5px;
border-top: 0;
border-left: 0;
border-right: 1px solid white;
border-bottom: 1px solid white;
}
table.docutils td p {
margin-top: 0;
margin-bottom: 0.3em;
}
table.field-list td, table.field-list th {
border: 0 !important;
word-break: break-word;
}
table.footnote td, table.footnote th {
border: 0 !important;
}
th {
color: white;
text-align: left;
padding-right: 5px;
background-color: #82A0BE;
}
div.literal-block-wrapper div.code-block-caption {
background-color: #EEE;
border-style: solid;
border-color: #CCC;
border-width: 1px 5px;
}
/* WIDE DESKTOP STYLE */
@media only screen and (min-width: 1176px) {
body {
margin: 0 40px 0 40px;
}
}
/* TABLET STYLE */
@media only screen and (min-width: 768px) and (max-width: 991px) {
body {
margin: 0 40px 0 40px;
}
}
/* MOBILE LAYOUT (PORTRAIT/320px) */
@media only screen and (max-width: 767px) {
body {
margin: 0;
}
div.bodywrapper {
margin: 0;
width: 100%;
border: none;
}
div.sphinxsidebar {
display: none;
}
}
/* MOBILE LAYOUT (LANDSCAPE/480px) */
@media only screen and (min-width: 480px) and (max-width: 767px) {
body {
margin: 0 20px 0 20px;
}
}
/* RETINA OVERRIDES */
@media
only screen and (-webkit-min-device-pixel-ratio: 2),
only screen and (min-device-pixel-ratio: 2) {
}
/* -- end ------------------------------------------------------------------- */
\ No newline at end of file
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment