608    t_slice_x x, t_slice_type type, t_slice_G G, t_neigh_list neigh_list,
 
  609    int N_local, t_neigh_parallel neigh_op_tag, t_angle_parallel angle_op_tag )
 
  611    Cabana::deep_copy( G, 0.0 );
 
  613    Kokkos::RangePolicy<exe_space> policy( 0, N_local );
 
  625    auto calc_radial_symm_op = KOKKOS_LAMBDA( 
const int i, 
const int j )
 
  631        int memberindex, globalIndex;
 
  633        T_F_FLOAT dxij, dyij, dzij;
 
  635        int attype = type( i );
 
  636        for ( 
int groupIndex = 0; groupIndex < numSFGperElem_( attype );
 
  639            if ( SF_( attype, SFGmemberlist_( attype, groupIndex, 0 ), 1 ) ==
 
  642                size_t memberindex0 = SFGmemberlist_( attype, groupIndex, 0 );
 
  643                size_t e1 = SF_( attype, memberindex0, 2 );
 
  644                double rc = SF_( attype, memberindex0, 7 );
 
  646                    SFGmemberlist_( attype, groupIndex, maxSFperElem_ );
 
  649                dxij = ( x( i, 0 ) - x( j, 0 ) ) * 
CFLENGTH * convLength_;
 
  650                dyij = ( x( i, 1 ) - x( j, 1 ) ) * 
CFLENGTH * convLength_;
 
  651                dzij = ( x( i, 2 ) - x( j, 2 ) ) * 
CFLENGTH * convLength_;
 
  652                r2ij = dxij * dxij + dyij * dyij + dzij * dzij;
 
  654                if ( e1 == nej && rij < rc )
 
  658                    for ( 
size_t k = 0; k < size; ++k )
 
  660                        memberindex = SFGmemberlist_( attype, groupIndex, k );
 
  661                        globalIndex = SF_( attype, memberindex, 14 );
 
  662                        eta = SF_( attype, memberindex, 4 );
 
  663                        rs = SF_( attype, memberindex, 8 );
 
  664                        G( i, globalIndex ) +=
 
  665                            exp( -eta * ( rij - rs ) * ( rij - rs ) ) * pfcij;
 
  671    Cabana::neighbor_parallel_for(
 
  672        policy, calc_radial_symm_op, neigh_list, Cabana::FirstNeighborsTag(),
 
  673        neigh_op_tag, 
"Mode::calculateRadialSymmetryFunctionGroups" );
 
  676    auto calc_angular_symm_op =
 
  677        KOKKOS_LAMBDA( 
const int i, 
const int j, 
const int k )
 
  679        double pfcij = 0.0, pdfcij = 0.0;
 
  680        double pfcik = 0.0, pdfcik = 0.0;
 
  681        double pfcjk = 0.0, pdfcjk = 0.0;
 
  683        int memberindex, globalIndex;
 
  684        double rij, r2ij, rik, r2ik, rjk, r2jk;
 
  685        T_F_FLOAT dxij, dyij, dzij, dxik, dyik, dzik, dxjk, dyjk, dzjk;
 
  686        double eta, rs, lambda, zeta;
 
  688        int attype = type( i );
 
  689        for ( 
int groupIndex = 0; groupIndex < numSFGperElem_( attype );
 
  692            if ( SF_( attype, SFGmemberlist_( attype, groupIndex, 0 ), 1 ) ==
 
  695                size_t memberindex0 = SFGmemberlist_( attype, groupIndex, 0 );
 
  696                size_t e1 = SF_( attype, memberindex0, 2 );
 
  697                size_t e2 = SF_( attype, memberindex0, 3 );
 
  698                double rc = SF_( attype, memberindex0, 7 );
 
  700                    SFGmemberlist_( attype, groupIndex, maxSFperElem_ );
 
  703                dxij = ( x( i, 0 ) - x( j, 0 ) ) * 
CFLENGTH * convLength_;
 
  704                dyij = ( x( i, 1 ) - x( j, 1 ) ) * 
CFLENGTH * convLength_;
 
  705                dzij = ( x( i, 2 ) - x( j, 2 ) ) * 
CFLENGTH * convLength_;
 
  706                r2ij = dxij * dxij + dyij * dyij + dzij * dzij;
 
  708                if ( ( e1 == nej || e2 == nej ) && rij < rc )
 
  716                    if ( ( e1 == nej && e2 == nek ) ||
 
  717                         ( e2 == nej && e1 == nek ) )
 
  720                            ( x( i, 0 ) - x( k, 0 ) ) * 
CFLENGTH * convLength_;
 
  722                            ( x( i, 1 ) - x( k, 1 ) ) * 
CFLENGTH * convLength_;
 
  724                            ( x( i, 2 ) - x( k, 2 ) ) * 
CFLENGTH * convLength_;
 
  725                        r2ik = dxik * dxik + dyik * dyik + dzik * dzik;
 
  732                            r2jk = dxjk * dxjk + dyjk * dyjk + dzjk * dzjk;
 
  733                            if ( r2jk < rc * rc )
 
  737                                                pfcik, pdfcik, rik, rc, 
false );
 
  741                                                pfcjk, pdfcjk, rjk, rc, 
false );
 
  743                                double const rinvijik = 1.0 / rij / rik;
 
  744                                double const costijk =
 
  745                                    ( dxij * dxik + dyij * dyik +
 
  748                                double vexp = 0.0, rijs = 0.0, riks = 0.0,
 
  750                                for ( 
size_t l = 0; l < size; ++l )
 
  754                                              SFGmemberlist_( attype,
 
  757                                    memberindex = SFGmemberlist_(
 
  758                                        attype, groupIndex, l );
 
  759                                    eta = SF_( attype, memberindex, 4 );
 
  760                                    lambda = SF_( attype, memberindex, 5 );
 
  761                                    zeta = SF_( attype, memberindex, 6 );
 
  762                                    rs = SF_( attype, memberindex, 8 );
 
  768                                        vexp = exp( -eta * ( rijs * rijs +
 
  774                                                    ( r2ij + r2ik + r2jk ) );
 
  775                                    double const plambda =
 
  776                                        1.0 + lambda * costijk;
 
  778                                    if ( plambda <= 0.0 )
 
  781                                        fg *= pow( plambda, ( zeta - 1.0 ) );
 
  782                                    G( i, globalIndex ) +=
 
  783                                        fg * plambda * pfcij * pfcik * pfcjk;
 
  792    Cabana::neighbor_parallel_for(
 
  793        policy, calc_angular_symm_op, neigh_list, Cabana::SecondNeighborsTag(),
 
  794        angle_op_tag, 
"Mode::calculateAngularSymmetryFunctionGroups" );
 
  797    auto scale_symm_op = KOKKOS_LAMBDA( 
const int i )
 
  799        int attype = type( i );
 
  802        int memberindex, globalIndex;
 
  803        double raw_value = 0.0;
 
  804        for ( 
int groupIndex = 0; groupIndex < numSFGperElem_( attype );
 
  807            memberindex0 = SFGmemberlist_( attype, groupIndex, 0 );
 
  809            size_t size = SFGmemberlist_( attype, groupIndex, maxSFperElem_ );
 
  810            for ( 
size_t k = 0; k < size; ++k )
 
  813                    attype, SFGmemberlist_( attype, groupIndex, k ), 14 );
 
  814                memberindex = SFGmemberlist_( attype, groupIndex, k );
 
  816                if ( SF_( attype, memberindex0, 1 ) == 2 )
 
  817                    raw_value = G( i, globalIndex );
 
  818                else if ( SF_( attype, memberindex0, 1 ) == 3 )
 
  820                        G( i, globalIndex ) *
 
  821                        pow( 2, ( 1 - SF_( attype, memberindex, 6 ) ) );
 
  823                G( i, globalIndex ) =
 
  824                    scale( attype, raw_value, memberindex, SFscaling_ );
 
  828    Kokkos::parallel_for( 
"Mode::scaleSymmetryFunctionGroups", policy,
 
 
  837    t_slice_type type, t_slice_G G, t_slice_dEdG dEdG, t_slice_E E, 
int N_local )
 
  844    Kokkos::RangePolicy<exe_space> policy( 0, N_local );
 
  855    auto calc_nn_op = KOKKOS_LAMBDA( 
const int atomindex )
 
  857        int attype = type( atomindex );
 
  859        int layer_0, layer_lminusone;
 
  860        layer_0 = (int)numSFperElem_( attype );
 
  862        for ( 
int k = 0; k < layer_0; ++k )
 
  863            NN( atomindex, 0, k ) = G( atomindex, k );
 
  865        for ( 
int l = 1; l < numLayers_; l++ )
 
  868                layer_lminusone = layer_0;
 
  870                layer_lminusone = numNeuronsPerLayer_( l - 1 );
 
  872            for ( 
int i = 0; i < numNeuronsPerLayer_( l ); i++ )
 
  875                for ( 
int j = 0; j < layer_lminusone; j++ )
 
  876                    dtmp += weights_( attype, l - 1, i, j ) *
 
  877                            NN( atomindex, l - 1, j );
 
  878                dtmp += bias_( attype, l - 1, i );
 
  881                    NN( atomindex, l, i ) = dtmp;
 
  882                    dfdx( atomindex, l, i ) = 1.0;
 
  884                else if ( AF_( l ) == 1 )
 
  887                    NN( atomindex, l, i ) = dtmp;
 
  888                    dfdx( atomindex, l, i ) = 1.0 - dtmp * dtmp;
 
  893        E( atomindex ) = NN( atomindex, numLayers_ - 1, 0 );
 
  896        for ( 
int k = 0; k < numNeuronsPerLayer_( 0 ); k++ )
 
  898            for ( 
int i = 0; i < numNeuronsPerLayer_( 1 ); i++ )
 
  899                inner( atomindex, 0, i ) =
 
  900                    weights_( attype, 0, i, k ) * dfdx( atomindex, 1, i );
 
  902            for ( 
int l = 1; l < numHiddenLayers_ + 1; l++ )
 
  904                for ( 
int i2 = 0; i2 < numNeuronsPerLayer_( l + 1 ); i2++ )
 
  906                    outer( atomindex, l - 1, i2 ) = 0.0;
 
  908                    for ( 
int i1 = 0; i1 < numNeuronsPerLayer_( l ); i1++ )
 
  909                        outer( atomindex, l - 1, i2 ) +=
 
  910                            weights_( attype, l, i2, i1 ) *
 
  911                            inner( atomindex, l - 1, i1 );
 
  912                    outer( atomindex, l - 1, i2 ) *=
 
  913                        dfdx( atomindex, l + 1, i2 );
 
  915                    if ( l < numHiddenLayers_ )
 
  916                        inner( atomindex, l, i2 ) =
 
  917                            outer( atomindex, l - 1, i2 );
 
  920            dEdG( atomindex, k ) = outer( atomindex, numHiddenLayers_ - 1, 0 );
 
  923    Kokkos::parallel_for( 
"Mode::calculateAtomicNeuralNetworks", policy,
 
 
  933    t_slice_x x, t_slice_f f_a, t_slice_type type, t_slice_dEdG dEdG,
 
  934    t_neigh_list neigh_list, 
int N_local, t_neigh_parallel neigh_op_tag,
 
  935    t_angle_parallel angle_op_tag )
 
  939    Kokkos::RangePolicy<exe_space> policy( 0, N_local );
 
  951    auto calc_radial_force_op = KOKKOS_LAMBDA( 
const int i, 
const int j )
 
  956        T_F_FLOAT dxij, dyij, dzij;
 
  958        int memberindex, globalIndex;
 
  960        int attype = type( i );
 
  962        for ( 
int groupIndex = 0; groupIndex < numSFGperElem_( attype );
 
  965            if ( SF_( attype, SFGmemberlist_( attype, groupIndex, 0 ), 1 ) ==
 
  968                size_t memberindex0 = SFGmemberlist_( attype, groupIndex, 0 );
 
  969                size_t e1 = SF_( attype, memberindex0, 2 );
 
  970                double rc = SF_( attype, memberindex0, 7 );
 
  972                    SFGmemberlist_( attype, groupIndex, maxSFperElem_ );
 
  974                size_t nej = type( j );
 
  975                dxij = ( x( i, 0 ) - x( j, 0 ) ) * 
CFLENGTH * convLength_;
 
  976                dyij = ( x( i, 1 ) - x( j, 1 ) ) * 
CFLENGTH * convLength_;
 
  977                dzij = ( x( i, 2 ) - x( j, 2 ) ) * 
CFLENGTH * convLength_;
 
  978                r2ij = dxij * dxij + dyij * dyij + dzij * dzij;
 
  980                if ( e1 == nej && rij < rc )
 
  986                    for ( 
size_t k = 0; k < size; ++k )
 
  989                            attype, SFGmemberlist_( attype, groupIndex, k ),
 
  991                        memberindex = SFGmemberlist_( attype, groupIndex, k );
 
  992                        eta = SF_( attype, memberindex, 4 );
 
  993                        rs = SF_( attype, memberindex, 8 );
 
  994                        double pexp = exp( -eta * ( rij - rs ) * ( rij - rs ) );
 
  997                            SFscaling_( attype, memberindex, 6 ) *
 
  998                            ( pdfcij - 2.0 * eta * ( rij - rs ) * pfcij ) *
 
 1000                        f_a( i, 0 ) -= ( dEdG( i, globalIndex ) *
 
 1001                                         ( p1 * dxij ) * 
CFFORCE * convForce_ );
 
 1002                        f_a( i, 1 ) -= ( dEdG( i, globalIndex ) *
 
 1003                                         ( p1 * dyij ) * 
CFFORCE * convForce_ );
 
 1004                        f_a( i, 2 ) -= ( dEdG( i, globalIndex ) *
 
 1005                                         ( p1 * dzij ) * 
CFFORCE * convForce_ );
 
 1007                        f_a( j, 0 ) += ( dEdG( i, globalIndex ) *
 
 1008                                         ( p1 * dxij ) * 
CFFORCE * convForce_ );
 
 1009                        f_a( j, 1 ) += ( dEdG( i, globalIndex ) *
 
 1010                                         ( p1 * dyij ) * 
CFFORCE * convForce_ );
 
 1011                        f_a( j, 2 ) += ( dEdG( i, globalIndex ) *
 
 1012                                         ( p1 * dzij ) * 
CFFORCE * convForce_ );
 
 1018    Cabana::neighbor_parallel_for( policy, calc_radial_force_op, neigh_list,
 
 1019                                   Cabana::FirstNeighborsTag(), neigh_op_tag,
 
 1020                                   "Mode::calculateRadialForces" );
 
 1023    auto calc_angular_force_op =
 
 1024        KOKKOS_LAMBDA( 
const int i, 
const int j, 
const int k )
 
 1027        double pdfcij = 0.0;
 
 1028        double pfcik, pdfcik, pfcjk, pdfcjk;
 
 1030        double rij, r2ij, rik, r2ik, rjk, r2jk;
 
 1031        T_F_FLOAT dxij, dyij, dzij, dxik, dyik, dzik, dxjk, dyjk, dzjk;
 
 1032        double eta, rs, lambda, zeta;
 
 1033        int memberindex, globalIndex;
 
 1035        int attype = type( i );
 
 1036        for ( 
int groupIndex = 0; groupIndex < numSFGperElem_( attype );
 
 1039            if ( SF_( attype, SFGmemberlist_( attype, groupIndex, 0 ), 1 ) ==
 
 1042                size_t memberindex0 = SFGmemberlist_( attype, groupIndex, 0 );
 
 1043                size_t e1 = SF_( attype, memberindex0, 2 );
 
 1044                size_t e2 = SF_( attype, memberindex0, 3 );
 
 1045                double rc = SF_( attype, memberindex0, 7 );
 
 1047                    SFGmemberlist_( attype, groupIndex, maxSFperElem_ );
 
 1050                dxij = ( x( i, 0 ) - x( j, 0 ) ) * 
CFLENGTH * convLength_;
 
 1051                dyij = ( x( i, 1 ) - x( j, 1 ) ) * 
CFLENGTH * convLength_;
 
 1052                dzij = ( x( i, 2 ) - x( j, 2 ) ) * 
CFLENGTH * convLength_;
 
 1053                r2ij = dxij * dxij + dyij * dyij + dzij * dzij;
 
 1055                if ( ( e1 == nej || e2 == nej ) && rij < rc )
 
 1062                    if ( ( e1 == nej && e2 == nek ) ||
 
 1063                         ( e2 == nej && e1 == nek ) )
 
 1066                            ( x( i, 0 ) - x( k, 0 ) ) * 
CFLENGTH * convLength_;
 
 1068                            ( x( i, 1 ) - x( k, 1 ) ) * 
CFLENGTH * convLength_;
 
 1070                            ( x( i, 2 ) - x( k, 2 ) ) * 
CFLENGTH * convLength_;
 
 1071                        r2ik = dxik * dxik + dyik * dyik + dzik * dzik;
 
 1078                            r2jk = dxjk * dxjk + dyjk * dyjk + dzjk * dzjk;
 
 1079                            if ( r2jk < rc * rc )
 
 1083                                                pfcik, pdfcik, rik, rc, 
true );
 
 1087                                                pfcjk, pdfcjk, rjk, rc, 
true );
 
 1089                                double const rinvijik = 1.0 / rij / rik;
 
 1090                                double const costijk =
 
 1091                                    ( dxij * dxik + dyij * dyik +
 
 1094                                double const pfc = pfcij * pfcik * pfcjk;
 
 1095                                double const r2sum = r2ij + r2ik + r2jk;
 
 1096                                double const pr1 = pfcik * pfcjk * pdfcij / rij;
 
 1097                                double const pr2 = pfcij * pfcjk * pdfcik / rik;
 
 1098                                double const pr3 = pfcij * pfcik * pdfcjk / rjk;
 
 1099                                double vexp = 0.0, rijs = 0.0, riks = 0.0,
 
 1101                                for ( 
size_t l = 0; l < size; ++l )
 
 1105                                              SFGmemberlist_( attype,
 
 1108                                    memberindex = SFGmemberlist_(
 
 1109                                        attype, groupIndex, l );
 
 1110                                    rs = SF_( attype, memberindex, 8 );
 
 1111                                    eta = SF_( attype, memberindex, 4 );
 
 1112                                    lambda = SF_( attype, memberindex, 5 );
 
 1113                                    zeta = SF_( attype, memberindex, 6 );
 
 1119                                        vexp = exp( -eta * ( rijs * rijs +
 
 1124                                        vexp = exp( -eta * r2sum );
 
 1126                                    double const plambda =
 
 1127                                        1.0 + lambda * costijk;
 
 1129                                    if ( plambda <= 0.0 )
 
 1132                                        fg *= pow( plambda, ( zeta - 1.0 ) );
 
 1134                                    fg *= pow( 2, ( 1 - zeta ) ) *
 
 1135                                          SFscaling_( attype, memberindex, 6 );
 
 1136                                    double const pfczl = pfc * zeta * lambda;
 
 1137                                    double factorDeriv =
 
 1138                                        2.0 * eta / zeta / lambda;
 
 1139                                    double const p2etapl =
 
 1140                                        plambda * factorDeriv;
 
 1146                                                   ( rinvijik - costijk / r2ij -
 
 1147                                                     p2etapl * rijs / rij ) +
 
 1151                                                   ( rinvijik - costijk / r2ik -
 
 1152                                                     p2etapl * riks / rik ) +
 
 1156                                            ( pfczl * ( rinvijik +
 
 1157                                                        p2etapl * rjks / rjk ) -
 
 1162                                        p1 = fg * ( pfczl * ( rinvijik -
 
 1166                                        p2 = fg * ( pfczl * ( rinvijik -
 
 1171                                             ( pfczl * ( rinvijik + p2etapl ) -
 
 1174                                    f_a( i, 0 ) -= ( dEdG( i, globalIndex ) *
 
 1175                                                     ( p1 * dxij + p2 * dxik ) *
 
 1177                                    f_a( i, 1 ) -= ( dEdG( i, globalIndex ) *
 
 1178                                                     ( p1 * dyij + p2 * dyik ) *
 
 1180                                    f_a( i, 2 ) -= ( dEdG( i, globalIndex ) *
 
 1181                                                     ( p1 * dzij + p2 * dzik ) *
 
 1184                                    f_a( j, 0 ) += ( dEdG( i, globalIndex ) *
 
 1185                                                     ( p1 * dxij + p3 * dxjk ) *
 
 1187                                    f_a( j, 1 ) += ( dEdG( i, globalIndex ) *
 
 1188                                                     ( p1 * dyij + p3 * dyjk ) *
 
 1190                                    f_a( j, 2 ) += ( dEdG( i, globalIndex ) *
 
 1191                                                     ( p1 * dzij + p3 * dzjk ) *
 
 1194                                    f_a( k, 0 ) += ( dEdG( i, globalIndex ) *
 
 1195                                                     ( p2 * dxik - p3 * dxjk ) *
 
 1197                                    f_a( k, 1 ) += ( dEdG( i, globalIndex ) *
 
 1198                                                     ( p2 * dyik - p3 * dyjk ) *
 
 1200                                    f_a( k, 2 ) += ( dEdG( i, globalIndex ) *
 
 1201                                                     ( p2 * dzik - p3 * dzjk ) *
 
 1211    Cabana::neighbor_parallel_for( policy, calc_angular_force_op, neigh_list,
 
 1212                                   Cabana::SecondNeighborsTag(), angle_op_tag,
 
 1213                                   "Mode::calculateAngularForces" );