Dimitris, Rhino won’t join surfaces unless the edges match. If you use splitedge on each of the inner srfs, using int to snap where they’re tangent, they all will join. Probably the same for the full array.
SplitEdge makes it so that Rhino can find a span or length of edge on each surface that is ‘joinable’ to the other - in fact you only need to split one of the edges - Rhino knows to split the other one with the info from the end points of the split one. If they are not split, then RhIno, I guess, sees only that there are parts too far apart to join and it does not know how to find a split point.
It’s a little tricky situation here. Aren’t there tolerances for that reason? Intersection works and gives 2 intersections, slightly different with each other. Is that of any help? Should they match exactly on edge and give only one intersection?
I guess the key thing is that Join is only looking for edge vertices, it does not do any intersecting, which, I’m told, is a very expensive and slow calculation.