From 8cf193ec5bb16f826ecd4fac6c7751bb2b998cf4 Mon Sep 17 00:00:00 2001 From: Salvatore Filippone Date: Fri, 24 Sep 2021 15:21:00 -0400 Subject: [PATCH] Fix TF --- .../impl/aggregator/newmatch_interface.cpp | 102 ++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 amgprec/impl/aggregator/newmatch_interface.cpp diff --git a/amgprec/impl/aggregator/newmatch_interface.cpp b/amgprec/impl/aggregator/newmatch_interface.cpp new file mode 100644 index 00000000..7d620577 --- /dev/null +++ b/amgprec/impl/aggregator/newmatch_interface.cpp @@ -0,0 +1,102 @@ +#include +#include +#include +#include "psb_base_cbind.h" +#include "MatchingAlgorithms.h" + +#ifdef __cplusplus +extern "C" { +#endif + +psb_i_t dnew_Match_If(psb_i_t ipar, psb_i_t matching, psb_d_t lambda, + psb_i_t nr, psb_i_t irp[], psb_i_t ja[], + psb_d_t val[], psb_d_t diag[], + psb_d_t w[], psb_i_t mate[]); + +#ifdef __cplusplus + } +#endif + +psb_i_t dnew_Match_If(psb_i_t ipar, psb_i_t matching, psb_d_t lambda, + psb_i_t nr, psb_i_t irp[], psb_i_t ja[], + psb_d_t val[], psb_d_t diag[], psb_d_t w[], + psb_i_t mate[]) +{ + psb_i_t info; + psb_i_t i,j; + psb_i_t ftcoarse=1; + psb_i_t cr_it=0, cr_relax_type=0; + psb_d_t cr_relax_weight=0.0; + + vector s; + vector t; + vector weights; + vector mateNode; + NODE_T u,v; + VAL_T weight; + psb_i_t preprocess = matching; // 0 no greedy 1 greedy + psb_i_t romaInput = ipar; // 1 sequential 2 parallel + // VAL_T lambda = 2; // positive real value + psb_d_t aii, ajj, aij, wii, wjj, tmp1, tmp2, minabs, edgnrm; + psb_i_t nt; // number of threads, got with 1 for testing purposes. + psb_d_t timeDiff; + MatchStat pstat; + double eps=1e-16; + double minweight,maxweight; + char *numthreadsenv; + + numthreadsenv=getenv("OMP_NUM_THREADS"); + if (numthreadsenv) { + sscanf(numthreadsenv,"%d",&nt); + } else { + nt = 1; + } + + maxweight = eps; + minweight = 1e300; + // fprintf(stderr,"Sanity check: %d %d \n",nr,nc); + for (i=1; iu) { + // Define Ahat entry + aij = val[j-1]; + aii = diag[v]; + ajj = diag[u]; + wii = w[v]; + wjj = w[u]; + edgnrm = aii*(wii*wii) + ajj*(wjj*wjj); + if (edgnrm > eps) { + weight = 1.0 - (2*1.0*aij*wii*wjj)/(aii*(wii*wii) + ajj*(wjj*wjj)); + } else { + weight = eps; + } + // + s.push_back(u); + t.push_back(v); + weights.push_back(weight); + if (weight>maxweight) maxweight=weight; + if (weight=0) { + mate[i] = mateNode[i]+1; + } else { + mate[i] = mateNode[i]; + //fprintf(stderr,"From runRomaWrapper: %d %d\n",i,mateNode[i]); + } + } + return(0); +}