\pagebreak
\section{Fortran \code{ASSOCIATE} Construct}
\fortranspecificstart
\label{sec:associate}
\index{ASSOCIATE construct, Fortran@\code{ASSOCIATE} construct, Fortran}

The following is an invalid example of specifying an associate name on a data-sharing attribute 
clause. The constraint in the Data Sharing Attribute Rules section in the OpenMP 
4.0 API Specifications states that an associate name preserves the association 
with the selector established at the \code{ASSOCIATE} statement. The associate 
name \plc{b} is associated with the shared variable \plc{a}. With the predetermined data-sharing 
attribute rule, the associate name \plc{b} is not allowed to be specified on the \code{private} 
clause.

\fnexample[4.0]{associate}{1}

In next example, within the \code{parallel} construct, the association name \plc{thread\_id} 
is associated with the private copy of \plc{i}. The print statement should output the 
unique thread number.

\fnexample[4.0]{associate}{2}

The following example illustrates the effect of specifying a selector name on a data-sharing 
attribute clause. The associate name \plc{u} is associated with \plc{v} and the variable \plc{v} 
is specified on the \code{private} clause of the \code{parallel} construct. 
The construct association is established prior to the \code{parallel} region. 
The association between \plc{u} and the original \plc{v} is retained (see the Data Sharing 
Attribute Rules section in the OpenMP 4.0 API Specifications). Inside the \code{parallel} 
region, \plc{v} has the value of -1 and \plc{u} has the value of the original \plc{v}.

\pagebreak
\ffreenexample[4.0]{associate}{3}

% blue line floater at top of this page for "Fortran, cont."
\begin{figure}[t!]
\linewitharrows{-1}{dashed}{Fortran (cont.)}{8em}
\end{figure}
\label{sec:associate_target}

\bigskip
The following example illustrates mapping behavior for a Fortran
associate name and its selector for a \scode{target} construct.

For the first 3 \scode{target} constructs the associate name \splc{a_aray} is
associated with the selector \splc{aray}, an array.  
For the \scode{target} construct of code block TARGET 1 just the selector
\splc{aray} is used and is implicitly mapped,
likewise for the associate name \splc{a_aray} in the TARGET 2 block.  
However, mapping an associate name and its selector is not valid for the same
\scode{target} construct.  Hence the TARGET 3 block is non-conforming.


In TARGET 4, the \splc{scalr} selector used in the \scode{target} region 
has an implicit data-sharing attribute of firstprivate since it is a scalar.
Hence, the assigned value is not returned.
In TARGET 5, the associate name \splc{a_scalr} is implicitly mapped and the
assigned value is returned to the host (default \scode{tofrom} mapping behavior).
In TARGET 6, the use of the associate name and its selector in the \scode{target}
region is conforming because the scalar firstprivate behavior of the selector 
and the implicit mapping of the associate name are allowed.  
At the end of the \scode{target} region only the 
associate name's value is returned to the host. 
In TARGET 7, the selector and associate name appear in
an explicit mapping for the same \scode{target} construct, 
hence the code block is non-conforming.

\ffreenexample[5.1]{associate}{4}
\fortranspecificend

