Full cokriging of *Z*_{1} accounting for secondary variables
*Z*_{2},..., *Z*_{Nv} requires the inference of all covariance functions
(,) *C*_{i, j}(,) between variables i and j.
This very difficult task can be eased by considering only the colocated secondary variables. The underlying hypotheses is that the colocated value screens out the influence of further away data. In this situation, only the covariances *C*_{1, j} need be inferred.
The MM1 approximation alleviate the modeling effort further with the following approximation:

where
*C*_{i, j}(0) = *C*_{i, j}(,) = *C*_{i, j}(,)

This approximation is acceptable if the support of the secondary variables is not larger than the support of the primary variable *Z*_{1}. For example, if *Z*_{1} is rock porosity and *Z*_{2} rock permeability, MM1 approximation is acceptable. It would not be if *Z*_{2} were seismic amplitude, because seismic amplitude is generally defined on a much larger scale than porosity.

covariance |
is a model of Covariance | |

matrix |
is an object that represents a matrix. Expression mat(i,j) must be valid and return element (i,j) of the matrix (i and j are greater than or equal to 1), and the matrix must have a copy constructor. The elements of matrix are of type convertible to double. |

`MM1_covariance::MM1_covariance(const covariance& cov,`Constructs a

const matrix& A, unsigned int size)

`MM1_covariance`. Covariance function`cov`is*C*_{1, 1}, and matrix`A`contains the covariance values*C*_{i, j}(0). Notice that matrix`A`contains numbers, not pointers to functions as in LMC.`size`is the size of the covariance matrix. It is equal to the number of variables*N*_{v}.`double MM1_covariance::operator()(unsigned int i, unsigned int j,`Function call operator. Returns the covariance

const location& u1, const location& u2)

*C*_{i, j}(,) using the MM1 approximation.