Heat Sink Fan Duct

This model funnels the air flow of a 60 mm computer fan through a 40x90 mm heat sink. The whole thing is then mounted to the wall. The design is optimised for simple printing without any support.
$fn=80;
heatSinkWidth=90.2;
heatSinkHeight=40.2;
heatSinkLength=80;
fanWidth=60.7;
fanHeight=38;
module heatsink() {
cube([heatSinkLength,heatSinkWidth,heatSinkHeight], center=true);
}
module fan() {
cube([fanWidth,fanWidth,fanHeight], center=true);
}
%translate([0,0,(heatSinkLength/2)+fanHeight+heatSinkHeight]) rotate([0,90,0]) heatsink();
%translate([(fanWidth/2)-(heatSinkHeight/2),0,fanHeight/2]) fan();
module duct() {
wallWidth=1;
module right() {
hull() {
translate([(wallWidth/2),(heatSinkWidth/2)+(wallWidth/2),fanHeight+heatSinkHeight]) rotate([0,90,0]) cube([0.001,wallWidth,heatSinkHeight+wallWidth], center=true);
translate([(fanWidth/2)-(heatSinkHeight/2)+(wallWidth/2),(fanWidth/2)+(wallWidth/2),fanHeight]) cube([fanWidth+wallWidth,wallWidth,0.001], center=true);
}
}
module left() {
hull() {
translate([(wallWidth/2),(-heatSinkWidth/2)-(wallWidth/2),fanHeight+heatSinkHeight]) rotate([0,90,0]) cube([0.001,wallWidth,heatSinkHeight+wallWidth], center=true);
translate([(fanWidth/2)-(heatSinkHeight/2)+(wallWidth/2),-(fanWidth/2)-(wallWidth/2),fanHeight]) cube([fanWidth+wallWidth,wallWidth,0.001], center=true);
}
}
module front() {
hull() {
translate([(heatSinkHeight/2)+(wallWidth/2),0,fanHeight+heatSinkHeight]) rotate([0,90,0]) cube([0.001,heatSinkWidth+(wallWidth*2),wallWidth], center=true);
translate([(fanWidth/2)-(heatSinkHeight/2)+(fanWidth/2)+(wallWidth/2),0,fanHeight]) cube([wallWidth,fanWidth+wallWidth,0.001], center=true);
}
}
right();
left();
front();
}
module fanMountPlate() {
module base() {
hull() {
cube([fanWidth,fanWidth,0.001], center=true);
translate([0,0,2]) cube([fanWidth,fanWidth+2,0.001], center=true);
}
}
translate([(fanWidth/2)-(heatSinkHeight/2),0,1]) difference() {
base();
translate([0,0,-5]) cylinder(d=60,h=10); // fan hole
translate([25,25,-4.5]) cylinder(d=4,h=10);
translate([25,-25,-4.5]) cylinder(d=4,h=10);
translate([-25,25,-4.5]) cylinder(d=4,h=10);
translate([-25,-25,-4.5]) cylinder(d=4,h=10);
}
}
module back() {
difference() {
translate([-(heatSinkHeight/2)+(1/2),0,(40.2/2)+fanHeight]) cube([1,heatSinkWidth+(1*2),40.2], center=true);
translate([-(heatSinkHeight/2)+(1/2),0,(40.2/2)+fanHeight]) translate([-5,-40,-15]) rotate([0,90,0]) cylinder(d=3,h=10);
translate([-(heatSinkHeight/2)+(1/2),0,(40.2/2)+fanHeight]) translate([-5,40,-15]) rotate([0,90,0]) cylinder(d=3,h=10);
}
}
back();
translate([0,0,37]) fanMountPlate();
duct();