text:
Biomimetic shark skin: design, fabrication and hydrodynamic function
Li Wen, James C. Weaver, George V. Lauder
Journal of Experimental Biology 2014 217: 1656-1666; doi: 10.1242/jeb.097097
Li Wen
The Museum of Comparative Zoology, 26 Oxford Street, Harvard University, Cambridge, MA 02138, USASchool of Mechanical Engineering and Automation, Beihang University, Beijing 100191, China
For correspondence: liwen@buaa.edu.cn glauder@oeb.harvard.edu
James C. Weaver
Wyss Institute for Biologically Inspired Engineering, Harvard University, Cambridge, MA 02138, USA
George V. Lauder
The Museum of Comparative Zoology, 26 Oxford Street, Harvard University, Cambridge, MA 02138, USA
Although the functional properties of shark skin have been of considerable interest to both biologists and engineers because of the complex hydrodynamic effects of surface roughness, no study to date has successfully fabricated a flexible biomimetic shark skin that allows detailed study of hydrodynamic function. We present the first study of the design, fabrication and hydrodynamic testing of a synthetic, flexible, shark skin membrane. A three-dimensional (3D) model of shark skin denticles was constructed using micro-CT imaging of the skin of the shortfin mako (Isurus oxyrinchus). Using 3D printing, thousands of rigid synthetic shark denticles were placed on flexible membranes in a controlled, linear-arrayed pattern. This flexible 3D printed shark skin model was then tested in water using a robotic flapping device that allowed us to either hold the models in a stationary position or move them dynamically at their self-propelled swimming speed. Compared with a smooth control model without denticles, the 3D printed shark skin showed increased swimming speed with reduced energy consumption under certain motion programs. For example, at a heave frequency of 1.5 Hz and an amplitude of ±1 cm, swimming speed increased by 6.6% and the energy cost-of-transport was reduced by 5.9%. In addition, a leading-edge vortex with greater vorticity than the smooth control was generated by the 3D printed shark skin, which may explain the increased swimming speeds. The ability to fabricate synthetic biomimetic shark skin opens up a wide array of possible manipulations of surface roughness parameters, and the ability to examine the hydrodynamic consequences of diverse skin denticle shapes present in different shark species.
Although sharks are commonly described as cartilaginous fishes, they are in fact covered by numerous small dermal tooth-like elements termed placoid scales or denticles (e.g. Liem et al., 2001). These denticles are composed of an outer enameloid layer and an inner bone-like layer surrounding a pulp cavity, and the denticles are sculpted into complex three-dimensional (3D) shapes (Kemp, 1999; Meyer and Seegers, 2012; Motta et al., 2012; Oeffner and Lauder, 2012). Denticles erupt through the epidermis and thus are in direct contact with the water. The shape of shark denticles varies considerably over the body of individual animals (Fig. 1), and also displays remarkable variation among species (Castro, 2011; Reif, 1982a; Reif and Dinkelacker, 1982).
The structure of shark skin denticles and their possible effect on the pattern of water flow over the body has attracted considerable interest from biologists interested in the microstructure and distribution of denticles (Kemp, 1999; Meyer and Seegers, 2012; Motta et al., 2012; Reif, 1978; Reif, 1982a; Reif, 1985), engineers focused on how the surface roughness may reduce drag forces during locomotion (Bechert et al., 1997; Bechert et al., 2000; Lang et al., 2011), and researchers interested in generating biomimetic models of shark skin to reduce locomotor drag on humans and human-designed structures (Büttner and Schulz, 2011; Mollendorf et al., 2004). Bioengineering studies of shark skin denticle function have focused on the effects of denticle-like structures using scaled-up models of denticles to study how surface roughness affects drag forces (Dean and Bhushan, 2010; Lang et al., 2008; Lang et al., 2011; Luchini et al., 1991; Walsh, 1980; Walsh, 1983). Most previous experimental hydrodynamic studies have used simplified denticle models and studied the effects of surface roughness on flat plates, which were held in a rigid, stationary position while in flow. As the skin of live sharks bends and flexes during swimming and encounters complex time-dependent flows (Oeffner and Lauder, 2012), analysis of denticle models mounted on rigid plates may have relatively little relevance to the hydrodynamic environment experienced by denticles on freely swimming sharks.
In an effort to overcome these limitations, we previously investigated the hydrodynamic effect of shark skin denticles on flexible pieces of real shark skin that were moved by a robotic flapping mechanical device with amplitudes, frequencies and curvatures that closely approximate those of live sharks (Oeffner and Lauder, 2012). Comparison of the hydrodynamic effect of shark skin mounted on rigid plates with the performance of flexible skin membranes that were allowed to bend and change shape as they swam in flow showed that the dynamic bending of shark skin had a dramatic effect on propulsion. This suggests that analyzing flexible shark skin models during swimming is an important prerequisite to understanding how skin functions during in vivo locomotion (Oeffner and Lauder, 2012). And as shark skin is composed of numerous hard denticles embedded within a flexible dermis (Kemp, 1999; Meyer and Seegers, 2012), from a biomimetic perspective synthetic shark skin should contain both rigid and flexible components.
Our previous study (Oeffner and Lauder, 2012) was limited by the inability to manipulate the structure of denticles and by challenges associated with developing an adequate control: comparison of skin with denticles was made to skin pieces with denticles sanded off, which did not produce a completely smooth surface for comparison. The ability to fabricate biomimetic shark skin with rigid denticles attached to a flexible membrane and to study the function of this flexible artificial shark skin under biologically realistic swimming conditions would allow a much more detailed study of the function of shark skin surface roughness and its effect on locomotion than has previously been possible. To our knowledge, no study has yet described the design and manufacture of biomimetic shark skin with biologically accurate 3D rigid denticles mounted on a flexible dermis-like membrane, and tested the hydrodynamic function of this material against a smooth control under in vivo swimming conditions at relevant Reynolds (Re) and Strouhal (St) numbers.
Environmental scanning electron microscope (ESEM) images of the bonnethead shark (Sphyrna tiburo) skin surface at different body locations. Wide-view ESEM images were taken from skin pieces extracted at the positions of the head (A), the leading edge dorsal fin (B) and the anal fin (C), as indicated in the top panel. (D–F) Closer top-view ESEM images of the skin surface from regions A–C showing details of the 3D structure at each position. 'Typical' denticles along the trunk usually have an odd number of top-surface ridges. In D and F, denticles that have either three or five top-ridges can be observed. In particular, denticles at the anal fin position (F) have sharp top-ridges. 'Non-typical' denticle structures, such as denticles at the leading edge dorsal fin position (E) are teardrop shaped with a long mid-ridge and minimal side-ridges. When the shark is swimming, the natural flow direction across the denticle surface is from lower left to upper right, from denticle base to tip. Green scale bars, 200 μm; white scale bars, 100 μm.
In this paper, we describe our approach to designing and manufacturing flexible biomimetic shark skin using multimaterial 3D printing based on micro-computed tomography (micro-CT) scans of shark skin denticles from Isurus oxyrinchus Rafinesque. A detailed description of how we designed and fabricated biomimetic shark skin is given in the Materials and methods. We present measurements of the static force of the 3D printed shark skin and a smooth control at varying flow speeds in a water tank where the skin models were held still and parallel to the flow direction. We then dynamically moved the flexible 3D printed shark skin and its smooth control using a robotic device (see Lauder et al., 2007; Lauder et al., 2011; Lauder et al., 2012) using biologically relevant kinematic parameters. For each kinematic condition, we investigated how 3D printed shark skin affects the swimming speed, power consumption and cost-of-transport (COT) when the biomimetic shark skin membrane and the smooth control swim at their self-propelled speeds. In addition, the flow around both the biomimetic skin and smooth models was investigated with digital particle image velocimetry (DPIV).
Static drag force
Static drag force values and percentage drag reduction of the 3D printed shark skin and the smooth control membranes are compared in Table 1, and ratios of drag forces and performance relative to the dimensionless denticle ridge spacing S+ are given in Fig. 2. Drag force for both foils gradually increased as flow speed (U) was increased from 0.129 to 0.581 m s−1. At the minimal flow speed we tested (U=0.129 m s−1, S+=5.61), the 3D printed shark skin foil obtained a maximum static drag reduction of 8.72%. Increasing U and S+ resulted in an increasing drag ratio to a value of 1 which indicated that the shark skin and the smooth control exhibited similar drag. There is a critical flow speed (U*=0.345 m s−1) where a transition from 'drag decreasing' to 'drag increasing' occurs (Fig. 2A). This critical flow speed corresponds to a critical S+ (turbulent S+*=13.6; Fig. 2B). Below U* and S+*, the drag force of 3D printed shark skin is lower than that of the smooth control membrane and this is the drag reducing region. Above U* and S+*, the drag force of the skin model is higher, and this region is designated as the drag increasing regime. At the maximum tested flow speed (U=0.581 m s−1, S+=21.7; Table 1), the static drag force of the 3D printed shark skin increased 15.1% over that of the smooth control.
Dependence of static drag force and drag reduction percentage on channel flow speed, Reynolds number and S+
Drag force ratio dependence on flow speed and dimensionless denticle ridge spacing for turbulent flows. Ds/Dm is the ratio of static drag of the smooth foil (Ds) to static drag of the shark skin foil (Dm). (A) Dependence on the flow speed (U). (B) Dependence on dimensionless denticle ridge spacing for turbulent flows (turbulent S+). The red solid lines represent Ds/Dm=1, which indicates that the synthetic shark skin foil has the same static drag force as the smooth foil. The vertical dashed lines in A and B indicate 'critical' flow speed (U*) and critical S+ (S+*), respectively, where drag of the shark skin membrane is greater than that of the smooth control. Drag forces are means from N=5 trials for each measurement, which lasted 20 s. Error bars are ±1 s.e.m., and are the same for A and B. For further explanation, refer to the Materials and methods. Drag force values for the shark skin and smooth control membranes are provided in Table 1.
Self-propelled swimming speed of biomimetic shark skin
Fig. 3 shows the self-propelled swimming (SPS) speed of both foils as a function of heave amplitude (h) at frequency f=1 Hz without pitch (θ=0 deg). The SPS speed of both models increased with increasing heave amplitude. We found that the SPS speed of 3D printed shark skin showed a significant increase over that of the smooth membrane under higher heave amplitudes but no significant change at the two lowest heave amplitudes. The biggest increase in SPS speed (4.65%) from the 3D printed shark skin was recorded at h=±2.5 cm, f=1 Hz and θ=0 deg, when the skin model generated a mean SPS speed of 271.6 mm s−1 and the smooth foil generated an SPS speed of 259.5 mm s−1. During these heave amplitude experiments, the swimming foils self-propelled at a Re range of 8983–23,836 and a St range of 0.16–0.19.
Mean self-propelled swimming speed for synthetic shark skin and smooth control foils as a function of heave amplitude at fixed frequency without pitch motion. Self-propelled swimming (SPS) speed was recorded at a fixed frequency f=1 Hz without pitch motion (θ=0 deg). Motion programs are indicated below the bars, which show the corresponding frequency (f) and amplitude (h). Error bars are ±1 s.e.m. SPS speed values are averaged from N=5 trials for each measurement. Asterisks indicate a significant difference (0.0001<P<0.05).
Mean SPS speed for synthetic shark skin and smooth control foils as a function of frequency at fixed amplitude without pitch motion. SPS speed was recorded at a fixed amplitude h=±1 cm without pitch motion (θ=0 deg). Error bars are ±1 s.e.m. SPS speed values are averaged from N=5 trials for each measurement. Asterisks indicate a significant difference (0.0001<P<0.05).
Fig. 4 shows SPS speed as function of frequency at a fixed amplitude (h=±1 cm) without any pitch motion of the foils. The 3D printed shark skin displayed faster swimming speeds at a frequency f=1.5 Hz, and this was a significant 6.6% faster speed than that of the smooth membrane. At f=2.5 Hz, the shark skin membrane exhibited a slower mean swimming speed of 2.53% less than that of the smooth control surface foil. There was no significant difference in swimming speed of the two foils at both 1 and 2 Hz. During the frequency tests, the foils self-propelled at a Re range of 8983–25,508 and a St range of 0.13–0.17.
Fig. 5 shows the effect on SPS speed of adding pitch to the foil motion program. For both foils, both low and high pitch values produced slower swimming speeds than intermediate pitch motions, and a pitch angle of 10 deg produced the fastest swimming speed. Without any pitch (θ=0 deg), we found no significant difference in SPS speed between the 3D printed shark skin and the smooth membrane. The SPS speed of the shark skin model increased significantly by 3.2% at θ=5 deg, 4.7% at θ=10 deg and 2.7% at θ=15 deg compared with the smooth membrane. No significant differences between the two foils were found for the highest three pitch angles tested. For these pitch angle variation tests, the foils self-propelled at a Re range of 14,283–17,817 and a St range of 0.13–0.16.
Cost of transport (COT) and power consumption
In Table 2, COT and power consumption data are provided for selected kinematic conditions compared between the shark skin and smooth control foils. We focused on these kinematic conditions because they resulted in significant differences in SPS speed between the two foil models.
The 3D printed shark skin foil had a lower COT for five of the six kinematic conditions (Table 2). The maximum power reduction (5.6%) was recorded at a motion program of f=2.5 Hz, h=±1 cm and θ=0 deg. Under this kinematic condition, the SPS speed of 3D printed shark skin was 2.5% slower than that of the smooth membrane, but the shark skin membrane had a lower COT (by 3.14%) compared with the smooth foil. The maximum COT reduction of 5.87% due to the effect of 3D printed shark skin was recorded at f=1.5 Hz, h=±1 cm, θ=0 deg. Under this condition, the 3D printed shark skin foil also experienced a maximum increase in SPS speed of 6.6%.
We found that adding an appropriate pitch to the heave motion played a positive role in COT reduction for 3D printed shark skin. For example, the COT was reduced by 5.1%, the power consumption was reduced by 0.56% and the SPS speed of the skin model was 4.7% faster than that of the smooth membrane under conditions where f=1 Hz, h=±1.5 cm and θ=10 deg. Thus, the 3D printed shark skin required less energy for swimming per unit distance and was more efficient than the smooth foil. When pitch motion was increased to θ=30 deg, the SPS speed of the two membranes was very similar, and 3D printed shark skin required more power and had a higher COT than the smooth membrane.
Mean SPS speed for synthetic shark skin and smooth control foils as a function of pitch angle (θ) at fixed frequency and amplitude. SPS speed was recorded at a fixed frequency f=1 Hz and amplitude h=±1.5 cm. SPS speed values are means from N=5 trials for each measurement. Error bars are ±1 s.e.m. Asterisks indicate a significant difference (0.0001<P<0.05).
Hydrodynamic analyses
The hydrodynamics of 3D printed shark skin and smooth control membrane propulsion under three different kinematic conditions (h=±2.5 cm, f=1 Hz, θ=0 deg; h=±1 cm, f=1.5 Hz, θ=0 deg; h=±1.5 cm, f=1 Hz, θ=10 deg) was studied to better understand the effect of the foil surface on propulsion. Under these conditions, the shark skin model generated noticeably better swimming performance (a significant increase in SPS speed and a decrease in COT). Therefore, these three kinematic conditions can offer us the best insight into the hydrodynamic effect of 3D printed shark skin. We quantified fluid flow around the two foils at SPS speed using DPIV. Images of the water flow over the surface of both membranes swimming at their SPS speed at h=±1 cm and f=1.5 Hz are presented in Fig. 6A,B. The attached leading edge vortex (LEV) can be clearly seen near the surface of both the skin and smooth foils. Vorticity of the LEV plotted against the distance from the membrane surface along the y-direction at the instant of the half heave motion cycle (1/2T) is plotted in Fig. 6C. Along the transect away from the membrane surface, where vorticity strength of LEV starts from zero, we found that the vorticity gradually increases until it reaches a maximum, reflecting the vortex core location of the LEV. At a position further away from the membrane surface along the transects, the vorticity strength decreased to nearly zero where the free-stream flow was achieved.
We found that the LEV of 3D printed shark skin and smooth membranes differed in terms of both maximum vorticity and vortex core location during flapping. Fig. 7A shows that the peak vorticities of the LEV on the 3D printed shark skin foil were larger for all three kinematic conditions. In particular, at h=±1 cm, f=1.5 Hz, θ=0 deg and at h=±1.5 cm, f=1 Hz, θ=10 deg, the maximum LEV vorticities of the 3D printed shark skin were 27.3% and 32.8% greater than those of the smooth membrane. Fig. 7B shows that the vortex core appears at different locations on the foil's surface. For example, with a motion program of h=±2.5 cm, f=1 Hz, the 3D printed shark skin foil generated a maximum vorticity of 8.5 s−1 at a distance of 5.7 mm from the foil surface. In contrast, the smooth foil generated a maximum vorticity of 8.9 s−1 at a distance of 4.5 mm from the surface.
Power consumption and cost of transport of synthetic shark skin and smooth membranes under various motion programs
In this paper, we present the design, fabrication and analysis of the hydrodynamics of a 3D printed, biomimetic, flexible shark skin. The 3D model of the denticles was based on high-resolution micro-CT scans of the skin of a shortfin mako shark (I. oxyrinchus). Rigid synthetic shark denticles were fabricated on a flexible membrane in a controlled, non-random pattern using multimaterial 3D printing. This skin model was then actuated at the leading edge in a heave and/or pitch motion at a range of frequencies using a robotic device to enable the shark skin and smooth control membranes to swim at their self-propelled speeds. Our key results are as follows: (1) biomimetic shark skin resulted in a maximum static drag reduction of 8.7% at slower flow speeds, but increased drag at higher speeds; (2) under swimming conditions, biomimetic shark skin showed an increase of swimming speed under specific kinematic conditions of up to 6.6% and helped reduce swimming energy (or COT) for most kinematic conditions up to a maximum of 5.9%; and (3) compared with the smooth foil, a significantly enhanced LEV was generated by the 3D printed shark skin foil.
One overall result of this study is that the effect of shark skin surface denticles on swimming performance relative to a smooth control depends critically on the motion program. Changing how the skin is moved changes the magnitude (and, in some cases, the direction) of the effect. While many combinations of heave amplitude, pitch angle and frequency resulted in faster swimming performance and lower COT for shark skin foils relative to the smooth controls, this was not true for every motion program. Changing foil motion can have dramatic effects on foil curvature and hence denticle spacing, and thus on the dynamics of flow over the foil surface and the resulting swimming speeds.
Pattern of water flow over the biomimetic shark skin foil and the smooth control. (A) Streamline flow images of synthetic shark skin and (B) smooth foils moved at f=1.5 Hz and h=±1 cm. Images shown are at 50% of the heave cycle at t=T/2 (where T is flapping cycle). The blue arrow (top left) indicates flow direction. (C) Values for the vorticity of the leading edge vortex (LEV) near both membranes were taken along the red and blue line transects in A and B that extend from the foil surface into the flow, and are plotted against y-position along this transect. The red and blue dashed lines indicate the surface position of the synthetic shark skin and smooth membranes. The vorticity of the LEV is the mean of N=4 flapping cycles. The error bars are ±1 s.e.m.
Analysis of the leading edge vortex in the swimming biomimetic shark skin foil and the smooth control. Maximum vorticity (A) and position of the LEV center (distance from the membrane surface, B) of the synthetic shark skin and smooth membranes at three typical motions. Motion programs are indicated below the bars. Measurement results are the mean of N=4 flapping cycles. Error bars are ±1 s.e.m. Asterisks indicate a significant difference (0.0001<P<0.05).
In addition, we emphasize our belief that analysis of shark skin function specifically, and fish skin surface effects on propulsion generally, needs to occur under conditions of propulsion rather than just under static conditions where skin models are attached to rigid surfaces. Our recent study of foils made of shark skin showed that results obtained under rigid conditions are substantially different from those obtained when shark skin is allowed to flex and curve during swimming (Oeffner and Lauder, 2012), suggesting that hydrodynamic effects of shark skin not only may result from the complex 3D denticle geometry but also are likely influenced substantially by skin deformation due to its flexibility.
The most basic feature of fish body surfaces is that they are in motion and are dynamic during swimming. Understanding the hydrodynamic effects of fish skin surface structures thus requires analysis of their properties during motion and under conditions in which the skin (or biomimetic skin) can flex and bend in a natural manner.
Design and testing of biomimetic shark skin
Compared with some previous conventional fabrication methods such as computer numerical control (CNC) milling or molding (e.g. Dean and Bhushan, 2010; Han et al., 2008) for fabricating shark skin models, we believe that 3D printing offers a number of advantages, as well as one current limitation. 3D printing allows for a large area of synthetic membrane to be fabricated within a short amount of time (less than an hour). 3D printing technology also allows materials with different mechanical properties to be fabricated together, and allows rigid denticles to be embedded into a flexible membrane.
Techniques such as molding only replicate part of the shark skin surface (Han et al., 2008) and do not allow control over specific parameters of denticles such as size, morphology, spacing, distribution pattern and mechanical properties. Nor do such techniques allow models with surface overhangs and undercuts. In this study, a significant challenge was to use 3D printing to produce denticles that overlap and have overhangs, with an undercut area between the denticle crown and the membrane surface (Fig. 8). This morphology is characteristic of real shark skin denticles (Fig. 1), but is not reproduced by molding or basic mechanical fabrication procedures in which highly simplified denticles are designed with a mostly vertical orientation.
The one significant limitation that we experienced was an inability to 3D print at the biological scale of the shortfin mako shark denticles while retaining the full surface complexity of the natural shark denticles. Mako shark skin denticles are of the order of 150 μm in size, and have surface features down to 5–10 μm (e.g. Castro, 2011; Motta et al., 2012; Oeffner and Lauder, 2012; Reif, 1985). Using current multi-material 3D printing approaches, we were not able to fabricate membranes at this scale while maintaining the critical surface ridge features (Fig. 8), the overhanging shape and the overlap among denticles on the large membrane surface needed for hydrodynamic testing. Improvements in 3D printing technology in the future may allow at-scale printing of biologically realistic denticle surfaces, although some shark species possess much larger denticles (Castro, 2011) and our current resolution will be sufficient for at-scale printing of models for these species.
Despite this limitation, we were able to conduct appropriately scaled dynamic tests as a result of using a range of flow speeds and the self-propelled condition. We used a similar experimental protocol to that previously developed for the study of flexible foils made of real shark skin (Oeffner and Lauder, 2012). Our dynamic testing used swimming at the SPS speed of the foils, a key feature for studying aquatic propulsion because cycle-averaged thrust and drag forces must balance under this condition (Lauder et al., 2007; Lauder et al., 2011; Lauder et al., 2012). Study under non-self propelled conditions means that swimming foils are either generating insufficient thrust or are producing too much thrust for the tested speed, and this substantially changes locomotor dynamics (Lauder et al., 2011) and flow over the foil surface. In addition, our tests were conducted at values for which the three dimensionless scaling parameters Re, St and S+ represent biologically relevant values for animals swimming at slow to moderate cruising speeds (Webb and Keyes, 1982). Small sharks with lengths of 24.6 cm freely swim at a Re of around 29,000 and at a St range of 0.2–0.3 based on data in a previous study (Flammang et al., 2011). Depending on the motion program used, the Re for the swimming foils was up to 25,000. While this is certainly well below the Re of large open ocean sharks swimming at high speeds and below the classical open-channel transition to turbulent flows at Re near 105, it is representative of smaller sharks swimming at slow to moderate speeds, and is similar to values in our previous study of membranes made with real shark skin (Oeffner and Lauder, 2012). Flow over blunt-edged membranes under these conditions may actually be turbulent and exhibit significant separation around the leading edge (see Materials and methods) (Lane and Loehrke, 1980; Ota and Itasaka, 1976) that is also representative of flows observed over and in the wake of swimming sharks (e.g. Flammang et al., 2011; Wilga and Lauder, 2002). Fish fins often possess blunt leading edges (Lauder, 2011) and the biomimetic skin membranes tested here possess a similar thickness to length ratio to many fish fins. St numbers ranged up to almost 0.2, and although this is somewhat lower than the number seen for most fishes swimming at moderate to high speeds (Triantafyllou and Triantafyllou, 1995) (reflecting the relatively stiff nature of the foils with a central plastic supporting element with two layers of 3D printed material on each side), it is well within the range used by many swimming fishes, especially at slower speeds (Lauder and Tytell, 2006).
The Re based on foil length may not represent the best dimensionless number for comparisons among roughened surfaces with drag-reducing properties due to the denticle surface ridges, which have a small length scale compared with overall foil or body length. The dimensionless S+ parameter is the relevant metric for comparison here, and the length scales for our 3D printed shark skin denticles are in the 5–22 range (depending on flow speed) appropriate for analysis of drag reduction properties (Anderson et al., 1997).
Drag reduction of 3D printed shark skin
Re transition between laminar and turbulent flow for a flat plate under classical testing conditions is of the order of 105 in open channel flow, and both channel Re (Rech) and Re based on foil chord length (Rec) in the current study are below this laminar–turbulent transition number. However, our foil when tested under static conditions is not a thin plate or a flat plate mounted flush to a wall where the boundary layer can build up along the testing sample as in cannonical flat plate textbook examples of boundary layers (Batchelor, 1973; Reidy, 1987; Schlichting, 1979). Our tested foils have a blunt square leading edge (around 3.5 mm) with a chord to thickness ratio of approximately 22. This generates flows that are very different from laminar as water moves around the foil leading edge, separates and then flows unsteadily down along the membrane surface (Lane and Loehrke, 1980; Ota and Itasaka, 1976). Therefore, we suggest that the flow along most of our membrane surface was turbulent with oscillating separation bubbles and flow attaching and then separating and not becoming laminar until nearly the trailing edge. Lane and Loehrke (Lane and Loehrke, 1980) and Ota and Itasaka (Ota and Itasaka, 1976) have shown that even at these relatively low Reynolds numbers under static tests, flow does not become laminar until a distance of 20 times the foil thickness.
Our results show that 3D printed shark skin can generate a maximum static (non-moving) drag reduction of 8.7% and that as flow increases, drag reduction falls to 2–3% up to an S+ value of around 14. From available data in previous studies (Bechert et al., 1997; Bechert et al., 2000), a riblet-covered surface resulted in a drag reduction of less than 5% at a height/denticle spacing (h/s)=0.3. Our current 3D printed skin denticle model has a h/s of 0.21 for the denticle side-ridge and 0.41 for the mid-ridge (Fig. 8), which resulted in an average h/s of 0.31. At approximately the same h/s, the 3D printed shark skin resulted in similar maximal drag reduction (7–8%) to previous studies of riblet structures that generally mimic the top ridges of shark skin denticles (see Reidy, 1987; Walsh, 1980; Walsh, 1983). We suggest that besides the top ridges, other 3D denticle features such as the denticle crown, neck and undercut region and the space above the skin may also play important hydrodynamic roles in determining total static drag forces, although the nature of fluid flow among and under the surface of the denticles themselves is as yet unknown.
In previous studies of drag reduction due to riblets or ridges, it was found that by matching S+ values, drag reduction results were similar whether the riblet structures were tested in different fluids, flow speeds or scales (see Anderson et al., 1997; Bushnell and Moore, 1991). Therefore, similar S+ values among membranes allows comparison of drag reduction performed under different denticle sizes and flow conditions (Bechert and Bartenwerfer, 1989). In the current study, the denticle size and water flow speed together determine S+ (see Eqn 3 in Materials and methods). We found that the 'critical S+' of the 3D printed shark skin was quite different when compared with that of riblet surfaces with sawtooth and scalloped cross-sections where the critical S+ was found to be around 28 under turbulent flow conditions (Bechert et al., 1997). The region between zero and critical S+ represents the effective range of drag reduction as a result of denticle shape. Therefore, our current 3D printed shark skin membranes with the blunt leading edge showed a different effective range of static drag reduction to that found for previous studies of flat plate surfaces covered with riblets only.
3D printed shark skin under dynamic conditions
We hypothesize that the 3D printed shark skin membranes swam faster and more efficiently (lower COT for five out of six motion programs, Table 2) not only as a result of the static friction drag reduction but also possibly because of other mechanisms involving increased thrust generation. At a flow speed of 0.23 m s−1, we estimate that the static drag reduction due to the shark skin effect is ~3.5% (Table 1). When the biomimetic shark skin membrane was moved h=±1 cm, f=1.5 Hz, the SPS speed increased by 6.6% and the COT decreased by 5.9%. This suggests that the improvement in swimming performance from the 3D printed shark skin under dynamic motion is more substantial than static drag reduction at the same flow speed.
The propulsive performance of biomimetic flapping foils is affected by the formation of the LEV which has a significant impact on lift force production and leading edge suction force (e.g. Borazjani and Daghooghi, 2013). In our study, the flapping biomimetic shark skin membrane generated a stronger LEV than that of the smooth foil (Fig. 7), where the average peak vorticities of the LEV increased by 21.9% under three of our kinematic conditions. This result is similar to that obtained for flexible flapping membranes made of real shark skin (Oeffner and Lauder, 2012), and we hypothesize that the shark skin denticle surface has the effect of altering flow near the foil surface, and enhancing the LEV and thus improving thrust. Shark skin may thus function, simultaneously, both as a drag reduction mechanism and to promote thrust enhancement. Testing this hypothesis experimentally will be challenging, but a computational fluid dynamic study with biomimetic denticles on a moving foil may allow a more comprehensive dissection of the underlying physics of shark skin foil propulsion.
Our results suggest that the flow over the skin of freely swimming sharks needs to be considered as being dynamic because the skin both of the body and on fin surfaces moves in a pitch- and heave-like manner during locomotion (Flammang et al., 2011; Wilga and Lauder, 2002), and water is likely to separate over the relatively blunt leading edge (Lane and Loehrke, 1980; Ota and Itasaka, 1976) that characterizes many fish fins (Lauder, 2011). Most sharks do not swim at high speed for the majority of their daily activity pattern, and common cruising speeds for many sharks, including those species classically considered to be high-speed specialists, fall in the range of 0.5–1.0 body lengths s−1. Under these conditions, our data show that flow over the body and fins is likely to be complex, with separation bubbles and LEVs forming (Borazjani and Daghooghi, 2013). This greatly complicates our current view of laminar flows over the body and fins of swimming sharks as commonly depicted in the literature. In addition, even low amplitude maneuvering will expose leading edges of fins and the body to flow separation due to horizontal body oscillation, and sharks rarely swim in a perfectly rectilinear manner.
3D reconstructed micro-CT model of a single denticle at the mid-trunk position of a mako shark (Isurus oxyrinchus). Top (A), lateral (B) and anterior (C) views of the meshed surface are shown. The denticle, neck and base are indicated in the 45 deg angled view (D). Sample morphological measurements are provided in A–C. In A: DL, denticle length (151 μm); DW, denticle width (125 μm); RS, spacing between the mid- and side-denticle ridges (51 μm). In B: DH, denticle height (113 μm); BW, denticle base width (119 μm); NL, denticle neck length (45.1 μm); NW, denticle neck width (50.9 μm). In C: BL, denticle base length (83.8 μm); RHM, height of the mid-ridge between two dashed blue lines (21 μm); RHS, height of the side-ridge between the two dashed blue lines (11 μm). The height-to-spacing ratios of mid-ridge and side-ridge are 0.41 and 0.21, respectively (RHM/S=0.41; RHS/S=0.21). (E) Shark denticles were enlarged from the micro-CT model and then arrayed linearly on a membrane substrate. (F,G) Lateral (side) and stream-wise views of modeled denticles mounted on the membrane substrate for 3D printing. Denticles were printed in hard material, while the membrane substrate was printed in flexible material. In the lateral view (F), AD indicates the depth of the anchor that penetrates into the membrane substrate (0.85 mm) and SS indicates the spacing between two adjacent denticles along the stream-wise direction (1.93 mm). In the stream-wise view, SL indicates spacing between the mid-ridges of two adjacent denticles along the lateral direction (2.16 mm).
The ability to 3D print biomimetic shark skin opens up the possibility of altering denticle morphology by changing denticle ridge patterns and height, and changing the spacing and hence overlap among denticles. Quantitative hydrodynamic comparisons among 3D printed foils with different denticle patterns thus provides a robust experimental platform for understanding the considerable natural diversity of shark skin denticles both among species and on different body locations.
Fabrication of 3D printed shark skin
A freshly dead specimen of a male shortfin mako shark (I. oxyrinchus) with a total body length of 190 cm was obtained from fishermen near Boston, MA, USA. An area of skin ~10 cm2 was extracted using dissection instruments and carefully cleaned with a water jet. We then cut a smaller piece of skin (2×2 mm) from within this larger area and used a micro-CT scanner (Xradia VersaXRM-500, at Cornell University, Institute of Biotechnology) to scan the sample at a resolution of 1.583 μm in the x-, y- and z-directions. We picked a single representative skin denticle from this scan and constructed a 3D model, which was then covered in a digital mesh (Fig. 8A–D) using Mimics 3D modeling software (Materialise Inc., Leuven, Belgium).
The reconstructed denticle model was duplicated and linearly arrayed in a controlled pattern on a membrane substrate (Fig. 8E–G) in SolidWorks (SolidWorks Corp., Waltham, MA, USA). The parameters governing denticle spacing, which determine the distribution and position of denticles on the membrane, are provided in Fig. 8F,G. From the lateral or side view (Fig. 8F), the ridge tips of the denticles can be seen slightly overlapping the base of the next posterior denticle. All denticles penetrate into the membrane substrate and form an anchor-like structure as seen in the skin of a real mako shark (Motta et al., 2012). To fabricate a synthetic shark skin membrane, we used an Objet Connex500 3D printer (Stratasys Ltd, Eden Prairie, MN, USA), which uses multiple nozzles to print materials with different mechanical properties and colors. With this technology, we were able to use two different materials for fabricating a shark skin model that contained both rigid (for the denticles) and flexible (for the membrane substrate) parts. The Young's modulus for the rigid and flexible regions was about 1 GPa and 1 MPa, respectively. In addition, an easily removable support material was used to allow fabrication of overhanging denticles by providing a temporary surface to support 3D printing of the denticle crown.
This supporting material was carefully removed by water jet after the entire shark skin membrane was printed. It should be noted that the bio-inspired 'anchor' structures allow the denticles to remain undamaged and intact after being flushed with a strong water jet used during removal of the support material. This also ensures that the denticles remain firmly attached to the membrane substrate during locomotion and movements controlled by the mechanical flapping device. The Objet Connex500 printer, however, did not allow the denticles to be printed at-scale (150 μm denticle length, Fig. 1) because of limitations on printing resolution: tests of at-scale 3D printing showed an unacceptable degradation of fine denticle structure. Therefore, we scaled the denticle gradually up from its original size (Fig. 8A–C) until we obtained an acceptable size at which all 3D features of the denticle were identifiable. After a series of tests, synthetic denticles with clearly discernible 3D features such as the three surface ridges were obtained when the at-scale denticle model was magnified 12.4 times. In Fig. 9A, a wide-field scanning electron microscope (SEM) image of the 3D printed shark skin in a curved state is provided. The concave and convex structures on the membrane demonstrate its flexibility. Alterations in denticle overlap between the convex and concave regions are easily seen, and illustrate the effect on denticle spacing when the membrane substrate is curved compared with the printed skin in the flattened state (Fig. 9B). A single 3D printed denticle is shown in Fig. 9C. Dimensional scaling of the 3D printed skin relative to natural shark skin denticles is addressed below, where we show that they operate at a similar S+ region (Eqn 3) in our dynamic testing program despite the denticle size difference. In addition, we note that some shark species possess denticles that approach 1 mm in size (Castro, 2011), and thus our current 3D print resolution will be at-scale for future studies of other shark species.
SEM images of the fabricated synthetic shark skin membranes used for hydrodynamic testing. Rigid denticles were fabricated on a flexible substrate membrane using 3D printing technology. Membranes in curved and flattened states are shown in A and B, respectively. Note the changes in spacing among the denticles in the convex and concave portions of the curved membrane (A), and how denticles overlap each other in the concave region and when the membrane is flat (B). A single synthetic denticle (enclosed by the red dashed circle) on a human finger is shown in C. Each denticle measures ca. 1.5 mm in length.
Both synthetic shark skin and smooth-surface control membranes were printed at 177 mm height and 77 mm chord width (Fig. 10A,B); the aspect ratio of the foils was thus 2.3. In order to ensure that the two membranes had exactly the same mass (53.3 g), we slightly increased the thickness of the smooth control membrane substrate (Fig.10C,D). The smooth undersides of the synthetic shark skin membranes were glued to either side of a rectangular plastic foil so that the denticle-covered sides were exposed to the water flow during the experiments. Each shark skin foil thus had shark skin denticles on two sides (Fig. 10C), and the control foil was smooth on both sides (Fig. 10D). The plastic foils were made by laser-cutting plastic shim-stock material with a thickness of 0.508 mm and flexural stiffness of 9.8×10−4 N m−2, and with a height the same dimension as the 3D printed membrane substrates (177 mm) and a chord width 10 mm longer (87 mm). This design allowed the models to be clamped by a stainless steel sandwich bar (or spar) holder via bolts and through-holes and held in the water tank during experiments (Fig. 10). The leading edge of the foils was blunt with a thickness of 3.5 mm, and special care was taken to seal the 3D printed shark skin membranes against the central plastic shim so that no gaps occurred. In addition, the thickness of the stainless steel spar equaled the thickness of two layers of 3D printed shark skin membrane plus the thickness of the central stiff supporting plastic element so that the leading edge of the moving foil was formed by the stainless steel spar.
Analysis of foil static drag and self-propelled swimming
A robotic flapping device was used to investigate the hydrodynamics of the 3D printed shark skin and smooth control foils for both static and dynamic moving conditions. The experimental apparatus used a carriage containing heave and pitch motors mounted on two low-friction air-bearing rails above a recirculation flow tank [for more details of the robotic apparatus and the flow tank, see our previous publications (Lauder et al., 2007; Lauder et al., 2011; Lauder et al., 2012)]. An ATI Nano-17 six-axis force/torque transducer (ATI Industrial Automation Inc., Apex, NC, USA) was attached to the cylindrical shaft and allowed for three forces (Fx, Fy, Fz) and three torques (Tx, Ty, Tz) to be measured simultaneously. Foils were attached to the force transducer via a stainless steel clamp and submerged at mid-depth in the water tank.
The static drag forces on the foils were measured when they were aligned parallel to the tank flow direction. The flow tank had a rectangular cross-section of 25×30 cm with a 90 cm long working area and was filled with fresh water. Static drag force data consisted of eight data points at speeds between 0.129 and 0.581 m s−1 at 0.065 m s−1 increments. At very low flow speeds, drag forces fall below the ATI force transducer's resolution, and when flow speed is above 0.6 m s−1, surface waves occur: we thus restricted static testing to the range of 0.1 to 0.6 m s−1. The flow channel Reynolds number Rech calculated with the flow velocity and the channel width (25 cm), can be varied from Rech=32,250 to Rech=145,250. The flow tank hydraulic radius is 6.8 cm, and thus Reynolds numbers calculated using this parameter will be nearly the same as those using the foil cord of 7.7 cm. Reported static drag force is the mean from N=5 replicate trials for each measurement, which lasted 20 s, sampled at 1000 Hz. Using the Re number to estimate the flow regime is complicated by the blunt leading edge of the manufactured foils of 3.5 mm (Lane and Loehrke, 1980; Ota and Itasaka, 1976). This produces a separation bubble, which produces complex unsteady flows on a short foil such as this where nearly 20 times the foil thickness is needed to re-establish steady flow (Lane and Loehrke, 1980; Ota and Itasaka, 1976). Flows over the foils during static tests thus should be considered unsteady, and during dynamic testing, large separation bubbles are observed on the leading edge (see Fig. 6).
Fig. 10.
Biomimetic shark skin foil and smooth control assembled for testing. A flexible plastic foil (yellow) covered on both sides with 3D printed flexible synthetic shark skin (A,C), and a smooth membrane with the same mass used as a control (B,D). The membrane substrates of synthetic shark skin and smooth membranes are glued to both sides of the yellow plastic foil material forming a sandwich structure, as can be seen in the microscope images (C,D). The array of holes on the left side of the skin and control foil were used to attach the foils to a stainless steel bar, which was then attached to the flapping mechanical device. The blue arrow in D indicates water flow direction. Green scale bars, 10 mm; white scale bars, 3 mm.
The SPS speed of foils in motion was determined using a LabVIEW program (National Instruments, Austin, TX, USA) from data collected at five different flow speeds [for details of the self-propelled swimming method, see our previous studies (Lauder et al., 2007; Lauder et al., 2011; Lauder et al., 2012)]. The mean SPS speed for each kinematic condition was determined from the average of five replicate trials. Experiments were conducted in a recirculating flow tank that has been used in previous experiments on both fish locomotion (e.g. Blevins and Lauder, 2012; Flammang et al., 2011; Tytell and Lauder, 2004) and flapping foil propulsion (Alben et al., 2012; Lauder et al., 2007; Lauder et al., 2011; Lauder et al., 2012; Oeffner and Lauder, 2012; Quinn et al., 2014; Wen and Lauder, 2013). There is minimal tunnel blockage as foils are thin membranes ~3.5 mm across, while the flow tank channel is ~300 mm across.
To understand the hydrodynamics of the foil models under dynamic conditions, systematic experiments were performed over a range of kinematic parameters. In the lateral (side to side, or y-direction), the plastic foils were actuated with a heave motion at the leading edge:
(1) where y represents the heave motion of the foil in the lateral direction, h indicates heave amplitude and f indicates the flapping frequency. A number of heave amplitudes (h) ranging from ±1 to ±3 cm at 0.5 cm increments were tested without pitch motion. Four frequencies, f=1, 1.5, 2 and 2.5 Hz, were used at h=±1 cm for testing the frequency effect. At h=±1.5 cm and f=1 Hz, pitch motion was added to the leading edges of the foils:
The pitch angle (θ) of the foils was varied systematically at 5 deg increments in the range 0–30 deg. The phase difference between heave and pitch motions was set at 90 deg as in our previous studies, and this phase difference ensured that the maximum angle of attack for the swimming foils occurred as the foil crossed the midline of the path of motion. For each kinematic condition we used t-tests to determine whether the difference in swimming performance between the 3D printed shark skin and smooth control models was significant. After the SPS speeds were determined for each kinematic condition, three forces (Fx, Fy, Fz) and three torques (Tx, Ty, Tz) were recorded at SPS conditions for five replicate trials (N=5).
DPIV was used to characterize the flow around flapping foils under SPS conditions as in our previous studies (Lauder et al., 2007; Lauder et al., 2011; Lauder et al., 2012). The flow tank was seeded with small nearly neutrally buoyant particles. A continuous beam 8 W argon-ion laser (Innova 300 Series, Coherent Laser Group, CA, USA) was used to generate a light sheet ~20 cm wide that intersected with the middle of the foil and covered both the foil's leading and trailing edges. Digital movies of flow over the foils were obtained using a Photron PCI-1024 high-speed video camera (Photron Inc., San Diego, CA, USA; 1024×1024 pixel resolution). DPIV images were recorded at a sample rate of 1000 Hz and were analyzed with DaVis 7.2 software (LaVision Inc., Goettingen, Germany) as in our previous research (Blevins and Lauder, 2013; Quinn et al., 2014; Wen and Lauder, 2013).
To compare the static drag force between the 3D printed shark skin and the smooth control membranes, we defined a dimensionless number as Dshark/Dsmooth. Dshark is the static drag of the shark skin foil, and Dsmooth is the static drag of the smooth control. This is termed the drag force ratio and indicates the relative drag force of the 3D printed shark skin and the smooth control. We also defined the drag reduction rate of the 3D printed shark skin as 1–Dshark/Dsmooth. Positive values of the drag reduction rate correspond to a decrease in drag from the 3D printed shark skin foil, while the negative values correspond to increased drag.
We compared drag reduction performance of the 3D printed shark skin and smooth control membranes at a similar dimensionless parameter S+ based on previous studies of drag reduction by riblets (e.g. Anderson et al., 1997; Bechert et al., 1997), which showed that drag reduction performance is dictated by the dimensionless parameter S+. S+ represents an effective Reynolds number based on the spacing between riblets that reflects the gap between denticle top ridges:
(3) where S is the spacing between adjacent denticle ridges (S=0.623 mm), ρ is fluid density (ρ=997 kg m−3), ν is kinematic viscosity (ν=9.99×10−7 m2 s−1) and τw indicates the average shear stress of the whole membrane. Under open channel laminar flow condition (with Rech less than about 105), τw can be calculated by the following equation based on the Blasius solution (Yunus and Cimbala, 2004):
(4) where U indicates the free-stream flow tank speed and Rec indicates the Reynolds number based on chord length of the foils c (c =77 mm):
(5) While under open channel turbulent flow condition (Rech>5×105), τw can be calculated by the following (Anderson et al., 1997):
(6) Therefore, S+ under both laminar flow and turbulent flow conditions (laminar S+ and turbulent S+) can be calculated with Eqn 3 by using different formulas (Eqns 4 and 6) for the average shear stress. The swimming performance of the swimming foils was characterized by three main metrics: the self-propelled swimming speed (USPS), mean power consumption (P) during one flapping cycle, and the COT, which represents the energy required to move the foil 1 m kg−1 foil mass (Lauder et al., 2011). The average power P consumed in the fluid can be calculated as:
(7) where Fy represents the instantaneous measured lateral force along the heave direction, Q indicates the instantaneous torque and T indicates a flapping cycle. We define a power reduction as 1–Pshark/Psmooth. A positive power reduction means that the 3D printed shark skin foil requires smaller power consumption than the smooth control foil (i.e. Pshark<Psmooth). The COT can be calculated as:
(8) where m indicates the mass of the foils (53.3 g for our foils) and USPS indicates the self-propelled swimming speed of the foil membranes. We define a COT reduction as 1–COTshark/COTsmooth. The subscripts shark and smooth refer to the foils with the 3D printed biomimetic shark skin denticle membrane and the smooth control membrane, respectively.
Experimental studies of aquatic locomotion, biomimetic flapping foils and riblet function (e.g. Anderson et al., 1997; Triantafyllou and Triantafyllou, 1995; Triantafyllou, 2005) indicate that besides the Re number, another fundamental dimensionless parameter useful for understanding aquatic propulsion is the St number, which is important for characterizing the hydrodynamic performance of fish-like flapping locomotion:
(9) where f is flapping frequency, h is the amplitude of trailing edge motion during flapping and U is swimming speed.
Many thanks to Mark Ricco at Cornell University for conducting the high-resolution micro-CT scanning of shark denticles, Prof. Conor Walsh for use of Mimics software modules, and Mirko Kovac and Daniel Vogt for discussions on the complexities of shark skin fabrication. Prof. Rob Wood was very helpful in planning 3D printing of shark denticles, and provided access to the 3D Objet printer. Johannes Oeffner conducted the ESEM imaging for the panels used in Fig. 1, and was instrumental in the initial studies of shark skin dynamic function that were the stimulus for this paper. Special thanks to Aaron Boomsma for assistance with the S+ calculations and for comments and literature on laminar and turbulent transitions during shark skin testing.
L.W. and G.V.L. planned the experiments and data analysis, L.W. conducted the experiments and 3D modeling of shark skin, J.C.W. printed the models and contributed to planning the project and figure preparation, and L.W. and G.V.L. wrote the paper.
The authors declare no competing financial interests.
This work was supported by National Science Foundation grant EFRI-0938043 to G.L., and the Wyss Institute for Biologically Inspired Engineering at Harvard University.
Alben, S.,
Witt, C.,
Baker, T. V.,
Anderson, E. J. and
Lauder, G. V.
(2012). Dynamics of freely swimming flexible foils. Physics of Fluids A 24, 051901.
Anderson, E. J.,
MacGillivray, P. S. and
Demont, M. E.
(1997). Scallop shells exhibit optimization of riblet dimensions for drag reduction. Biol. Bull. 192, 341-344.
Batchelor, G. K.
(1973). An Introduction to Fluid Mechanics. Cambridge: Cambridge University Press.
Bechert, D. W. and
Bartenwerfer, M.
(1989). The viscous flow on surfaces with longitudinal ribs. J. Fluid Mech. 206, 105-129.
Bechert, D. W.,
Bruse, M.,
Hage, W.,
van der Hoeven, J. and
Hoppe, G.
(1997). Experiments on drag-reducing surfaces and their optimization with an adjustable geometry. J. Fluid Mech. 338, 59-87.
Bruse, M. and
Hage, W.
(2000). Experiments with three-dimensional riblets as an idealized model of shark skin. Exp. Fluids 28, 403-412.
Blevins, E. L. and
(2012). Rajiform locomotion: three-dimensional kinematics of the pectoral fin surface during swimming in the freshwater stingray Potamotrygon orbignyi. J. Exp. Biol. 215, 3231-3241.
Blevins, E. and
(2013). Swimming near the substrate: a simple robotic model of stingray locomotion. Bioinspir. Biomim. 8, 016005.
Borazjani, I. and
Daghooghi, M.
(2013). The fish tail motion forms an attached leading edge vortex. Proc. Biol. Sci. 280, 20122071.
Bushnell, D. M. and
Moore, K. J.
(1991). Drag reduction in nature. Annu. Rev. Fluid Mech. 23, 65-79.
Büttner, C. C. and
Schulz, U.
(2011). Shark skin inspired riblet structures as aerodynamically optimized high temperature coatings for blades of aeroengines. Smart Mater. Struct. 20, 094016.
Castro, J. I.
(2011). The Sharks of North America. Oxford: Oxford University Press.
Dean, B. and
Bhushan, B.
(2010). Shark-skin surfaces for fluid-drag reduction in turbulent flow: a review. Philos. Trans. R. Soc. A 368, 4775-4806.
Flammang, B. E.,
Lauder, G. V.,
Troolin, D. R. and
Strand, T.
(2011). Volumetric imaging of shark tail hydrodynamics reveals a three-dimensional dual-ring vortex wake structure. Proc. Biol. Sci. 278, 3670-3678.
Han, X.,
Zhang, D.,
Li, X. and
(2008). Bio-replicated forming of the biomimetic drag-reducing surfaces in large area based on shark skin. Chin. Sci. Bull. 53, 1587-1592.
Kemp, N. E.
(1999). Integumentary system and teeth. In Sharks, Skates, and Rays: The Biology of Elasmobranch Fishes (ed. Hamlett, W. C.), pp. 43-68. Baltimore, MD: Johns Hopkins University Press.
Lane, J. and
Loehrke, R.
(1980). Leading edge separation from a blunt plate at low Reynolds number. ASME Transactions. J. Fluids Eng. 102, 494-496.
Lang, A. W.,
Motta, P.,
Hidalgo, P. and
Westcott, M.
(2008). Bristled shark skin: a microgeometry for boundary layer control? Bioinspir. Biomim. 3, 046005.
Hueter, R. and
Habegger, M.
(2011). Shark skin separation control mechanisms. J. Mar. Technol. Soc. 45, 208-215.
(2011). Swimming hydrodynamics: ten questions and the technical approaches needed to resolve them. Exp. Fluids 51, 23-35.
Lauder, G. V. and
Tytell, E. D.
(2006). Hydrodynamics of undulatory propulsion. In Fish Biomechanics, Vol. 23 (ed. Shadwick, R. E. and Lauder, G. V.), pp. 425-468. San Diego, CA: Academic Press.
Tangorra, J. and
Madden, P. G.
(2007). Fish biorobotics: kinematics and hydrodynamics of self-propulsion. J. Exp. Biol. 210, 2767-2780.
Lauder, G.,
Tangorra, J.,
Lim, J.,
Shelton, R.,
Witt, C. and
Anderson, E. J.
(2011). Robotic models for studying undulatory locomotion in fishes. Mar. Technol. Soc. J. 45, 41-55.
Flammang, B. and
Alben, S.
(2012). Passive robotic models of propulsion by the bodies and caudal fins of fish. Integr. Comp. Biol. 52, 576-587.
Liem, K. F.,
Bemis, W. E.,
Walker, W. F. and
Grande, L.
(2001). Functional Anatomy of the Vertebrates. An Evolutionary Perspective, 3rd edn. Fort Worth, TX: Harcourt College Publishers.
Luchini, P.,
Manzo, F. and
Pozzi, A.
(1991). Resistance of a grooved surface to parallel flow and cross-flow. J. Fluid Mech. 228, 87-109.
OpenUrlWeb of Science
Meyer, W. and
Seegers, U.
(2012). Basics of skin structure and function in elasmobranchs: a review. J. Fish Biol. 80, 1940-1967.
Mollendorf, J. C.,
Termin, A. C. 2nd.,
Oppenheim, E. and
Pendergast, D. R.
(2004). Effect of swim suit design on passive drag. Med. Sci. Sports Exerc. 36, 1029-1035.
Habegger, M. L.,
Lang, A.,
Davis, J.
(2012). Scale morphology and flexibility in the shortfin mako Isurus oxyrinchus and the blacktip shark Carcharhinus limbatus. J. Morphol. 273, 1096-1110.
Oeffner, J. and
(2012). The hydrodynamic function of shark skin and two biomimetic applications. J. Exp. Biol. 215, 785-795.
Ota, T. and
Itasaka, M.
(1976). A separated and reattached flow on a blunt flat plate. J. Fluids Eng. 98, 79-84.
Quinn, D. B.,
Smits, A. J.
(2014). Scaling the propulsive performance of heaving flexible panels. J. Fluid Mech. 738, 250-267.
Reidy, L.
(1987). Flat Plate Reduction in a Water Tunnel Using Riblets: NOSC Technical Report 1169. San Diego, CA: Naval Ocean Systems Center.
Reif, W.-E.
(1978). Protective and hydrodynamic function of the dermal skeleton of elasmobranchs. Neues Jahrb. Geol. Palaontol. Abh. 157, 131-141.
(1982a). Morphogenesis and function of the squamation in sharks. Neues Jahrb. Geol. Palaontol. Abh. 164, 172-183.
OpenUrlGeoRef
(1985). Squamation and Ecology of Sharks. Frankfurt am Main: Senckenbergische Naturforschende Gesellschaft.
Reif, W.-E. and
Dinkelacker, A.
(1982). Hydrodynamics of the squamation in fast swimming sharks. Neues Jahrb. Geol. Palaontol. Abh. 164, 184-187.
Schlichting, H.
(1979). Boundary-Layer Theory. New York, NY: McGraw Hill.
Triantafyllou, M. S.
(2005). Review of hydrodynamic scaling laws in aquatic locomotion and fish-like swimming. Appl. Mech. Rev. 58, 226-237.
Triantafyllou, M. S. and
Triantafyllou, G. S.
(1995). An efficient swimming machine. Sci. Am. 272, 64-70.
Tytell, E. D. and
(2004). The hydrodynamics of eel swimming: I. Wake structure. J. Exp. Biol. 207, 1825-1841.
Denticle
You are going to email the following Biomimetic shark skin: design, fabrication and hydrodynamic function
Show more RESEARCH ARTICLES


Ruskin Christian School Warriors honored a pair of seniors and their parents at halftime of their 58-48 victory over Brandon Academy Monday. Basketball coach Micah Bonner saluted seniors Dylan Northrop, left, and Noah Statham along with their parents Paul and Jennifer Northrop and Latrelle and (not pictured) Charles Statham. The RCS Warriors ended regular season play Tuesday and open conference playoffs against a yet-to-be named opponent Friday night, hopefully at the Ruskin school.
The Ruskin Christian School (RCS) had their four-game winning streak snapped last Friday as the Warriors wrap up the regular season with two games this week, and wait for the playoff schedule in the Florida Christian Western Conference.
Jesse Mobley, #24, goes up with for a RCS bucket against Citrus Park as #15 junior Conner Kick brings support.
Coach Micah Bonner's squad had a case of over-confidence and sub-par performance Feb. 1 as they hosted the Citrus Park Eagles, a team RCS bombed 64-35 in mid-December. But the visitors from Tampa shocked the Warriors and the crowd in the RCS gym by coming from behind to nip RCS 51-47. It was only the second home loss of the year for the Warriors who fell to 14-4 overall and 10-3 in conference as they head into a Feb. 3 Seniors' Night game against Brandon Academy and a Feb. 5 match on the road with Community Christian of Bradenton.
The Warriors looked sluggish but took an early lead over Citrus Park before the wheels came off due to poor shooting and turnovers by RCS. The visiting Eagles capitalized on seven of eight, shooting at the charity stripe to nail down their upset win.
In the early-week game, RCS blew out the Calvary Baptist Academy for their fourth-straight victory 70-21 as Bonner and Paul Northrop cleared their bench. Freshman guard Sam Tuch registered 16 points; junior Jesse Mobley and sophomore Caleb Statham contributed 13 each.


Registration for 2018-2019 Michigan Science Olympiad is now open. Please read the information and instructions at http://miscioly.org/shop/. Much of the registration procedures are the same as the year before. Official event rules are anticipated to be made free electronically by the national organization at https://store.soinc.org/us/page/manuals. Registering for Michigan Science Olympiad covers your team's National and State dues. The Registration period will take place between June 1, 2018 and December 14, 2018. Registration fee will raise after this period has ended.
Please contact us if you have questions regarding registration.


text:
var mapzen = mapzen || {};
mapzen.whosonfirst = mapzen.whosonfirst || {};
mapzen.whosonfirst.boundaryissues = mapzen.whosonfirst.boundaryissues || {};

// for the time being this assumes jQuery is present
// that decision may change some day but not today
// (20160121/thisisaaronland)

mapzen.whosonfirst.boundaryissues.venue = (function() {

	var VenueIcon;

	var self = {
		map: null,
		properties: {
			'wof:placetype': 'venue'
		},

		reset_properties: function() {
			self.properties = {
				'wof:placetype': 'venue'
			};
			$('input[name="name"]').val('');
			$('textarea[name="address"]').val('');
			$('input[name="tags"]').val('');
		},

		set_property: function(name, value) {
			self.properties[name] = value;
			if (typeof value == 'object') {
				value = JSON.stringify(value);
			}
			if (typeof value == 'string') {
				value = htmlspecialchars(value);
			}
			$('td[data-property="' + name + '"]').html(value);
		},

		generate_feature: function() {

			var lat = parseFloat(self.properties['geom:latitude']);
			var lng = parseFloat(self.properties['geom:longitude']);

			var feature = {
				type: 'Feature',
				bbox: [lng, lat, lng, lat],
				geometry: {
					type: 'Point',
					coordinates: [lng, lat]
				},
				properties: self.properties
			};

			return feature;
		},

		generate_geojson: function() {
			return JSON.stringify(self.generate_feature());
		},

		save_to_server: function(geojson, success_cb, error_cb) {

			var data = {
				crumb: $('#venue').data('crumb-save'),
				geojson: geojson,
				csv_id: $('#csv_id').val(),
				csv_row: $('#csv_row').val()
			};

			var onsuccess = function(rsp) {
				if (! rsp.feature ||
				    ! rsp.feature.properties ||
				    ! rsp.feature.properties['wof:id']) {
					mapzen.whosonfirst.log.error("no feature returned from wof.save");
					return;
				}
				if (success_cb) {
					var wof_id = parseInt(rsp.feature.properties['wof:id']);
					success_cb(wof_id);
				}
			};

			var onerror = function(rsp) {
				if (error_cb) {
					error_cb(rsp);
				}
				mapzen.whosonfirst.log.error("error calling wof.save");
			};

			mapzen.whosonfirst.boundaryissues.api.api_call("wof.save", data, onsuccess, onerror);
		},

		lookup_hierarchy: function(ll) {

			$('#venue #parent').html('Loading...');
			self.looking_up_hierarchy = true;

			var lat = ll.lat;
			var lng = ll.lng;

			var feature = self.generate_feature();
			feature.geometry = {
				type: "Point",
				coordinates: [lng, lat]
			};
			feature.bbox = [lng, lat, lng, lat];
			var geojson = JSON.stringify(feature);
			var data = {
				geojson: geojson
			};

			var onsuccess = function(rsp) {
				if (! rsp.ok) {
					var message = 'Error reverse geocoding';
					var response = message;
					if (rsp.error) {
						response = '' + message + '';
						message += ': ' + rsp.error;
					}
					$('#venue #parent').html(response);
					mapzen.whosonfirst.log.error(message);
					return;
				}
				if (rsp.parents && rsp.parents.length == 1) {
					var parent = rsp.parents[0];
					self.set_property('wof:parent_id', parent['wof:id']);
					var url = mapzen.whosonfirst.boundaryissues.utils.abs_root_urlify('/id/' + parent['wof:id']);
					var link = '' + parent['wof:name'] + ' (' + parent['wof:placetype'] + ')';
					$('#venue #parent').html(link);
				} else {
					self.set_property('wof:parent_id', rsp.parent_id);
					$('#venue #parent').html('Unknown parent');
				}
				if (rsp.hierarchy) {
					self.set_property('wof:hierarchy', rsp.hierarchy);
				} else {
					self.set_property('wof:hierarchy', []);
				}

				self.looking_up_hierarchy = false;
				if (self.on_loaded_hierarchy) {
					self.on_loaded_hierarchy();
				}
			}

			var onerror = function(rsp) {
				self.looking_up_hierarchy = false;
				mapzen.whosonfirst.log.error('Error reverse geocoding.');
			};

			mapzen.whosonfirst.boundaryissues.api.api_call("wof.pip", data, onsuccess, onerror);
		},

		update_coordinates: function() {
			var ll = self.map.getCenter();
			self.lookup_hierarchy(ll);
			self.set_property('geom:latitude', ll.lat);
			self.set_property('geom:longitude', ll.lng);
		},

		show_feature_pin: function(map, geocoder, feature) {
			slippymap.crosshairs.hide();
			var html = 'Use this result Cancel';
			var popup = geocoder.marker.bindPopup(html).openPopup();
			var props = feature.properties;
			var ll = geocoder.marker.getLatLng();
			if (feature.bbox) {
				mapzen.whosonfirst.boundaryissues.bbox.set_bbox(map, feature.bbox);
			} else {
				map.panTo(ll);
			}
			$('#geocoder-marker-select').click(function(e) {
				e.preventDefault();
				slippymap.crosshairs.show();
				popup.closePopup();
				geocoder.collapse();
				map.removeLayer(geocoder.marker);
				map.setView(ll, 16);
				self.set_property('geom:latitude', ll.lat);
				self.set_property('geom:longitude', ll.lng);
				//self.lookup_hierarchy(ll.lat, ll.lng);
				//self.update_coordinates(ll, true);
				//self.set_marker(geocoder.marker);

				var address = self.get_geocoded_address(feature);
				if (address != '') {
					$('textarea[name="address"]').val(address);
					self.set_property('addr:full', address);
				}

				if (props.housenumber) {
					self.set_property('addr:housenumber', props.housenumber);
				}
				if (props.street) {
					self.set_property('addr:street', props.street);
				}
				if (props.postalcode) { // Seeing postAL code coming from Pelias, but we prefer 'postcode'
					self.set_property('addr:postcode', props.postalcode);
				}
				if (props.postcode) {
					self.set_property('addr:postcode', props.postcode);
				}
			});
			$('#geocoder-marker-cancel').click(function(e) {
				e.preventDefault();
				popup.closePopup();
				map.removeLayer(geocoder.marker);
			});
		},

		geocode_address: function(address, cb) {
			var api_key = document.body.getAttribute("data-mapzen-api-key");
			var esc_address = encodeURIComponent(address);
			var url = 'https://search.mapzen.com/v1/search?text=' + esc_address + '&api_key=' + api_key;
			var onsuccess = function(rsp) {
				if (rsp && rsp.features && rsp.features.length == 1) {
					var c = rsp.features[0].geometry.coordinates;
					var lng = c[0];
					var lat = c[1];
					self.select_geocoded(lat, lng);

					var address = self.get_geocoded_address(rsp.features[0]);
					if (address != '') {
						$('textarea[name="address"]').val(address);
						self.set_property('addr:full', address);
					}
				} else if (rsp && rsp.features && rsp.features.length > 1) {
					var html = '
';
					$.each(rsp.features, function(i, f) {
						var c = f.geometry.coordinates;
						var lng = c[0];
						var lat = c[1];
						var label = f.properties.name;
						if (f.properties.locality) {
							label += ', ' + f.properties.locality;
						}
						if (f.properties.region_a) {
							label += ', ' + f.properties.region_a;
						}
						var address = self.get_geocoded_address(f);
						html += '
' + htmlspecialchars(label) + '
';
					});
					html += '
';

					if ($('#venue-lookup-geocoded').length == 0) {
						$('#venue-lookup-address').after('

');
					}

					$('#venue-lookup-geocoded').html(html);
					$('#venue-lookup-geocoded a.geocoded').click(function(e) {
						e.preventDefault();
						var lat = parseFloat($(e.target).data('lat'));
						var lng = parseFloat($(e.target).data('lng'));
						self.select_geocoded(lat, lng);

						var address = $(e.target).data('address');
						if (address != '') {
							$('textarea[name="address"]').val(address);
							self.set_property('addr:full', address);
						}

						$('#venue-lookup-geocoded').html('');
						$('#venue-lookup-address').removeClass('choose-address');
					});

					$('#venue-lookup-address').addClass('choose-address');
				} else {
					$('#venue-lookup-geocoded').html('No results');
				}

				$('#venue-lookup-address').removeClass('loading');
				if (cb) {
					cb(rsp);
				}
			};
			var onerror = function() {
				mapzen.whosonfirst.log.error("unable to geocode address: " + address);
			};
			$('#venue-lookup-address').addClass('loading');
			mapzen.whosonfirst.net.fetch(url, onsuccess, onerror);
		},

		get_geocoded_address: function(feature) {

			// This is a US-centric way of encoding an address
			// (20170625/dphiffer)

			var props = feature.properties;
			var regex = new RegExp('^' + props.name);
			if (props.housenumber && props.street) {
				return props.label.replace(regex, props.housenumber + ' ' + props.street);
			} else {
				return '';
			}
		},

		select_geocoded: function(lat, lng) {
			self.map.setView([lat, lng], 16);
			var ll = self.map.getCenter();
			self.lookup_hierarchy(ll);
			self.set_property('geom:latitude', ll.lat);
			self.set_property('geom:longitude', ll.lng);
		},

		update_name: function() {
			console.log('update_name');
			var name = $('input[name="name"]').val();
			self.set_property('wof:name', name);
			self.check_nearby();
		},

		update_address: function() {
			console.log('update_address');
			var address = $('textarea[name="address"]').val();
			if (address != '') {
				self.set_property('addr:full', address);
			} else {
				delete self.properties['wof:address'];
			}
		},

		update_tags: function() {
			console.log('update_tags');
			var tag_list = $('input[name="tags"]').val();
			tag_list = tag_list.split(',');
			var tags = [];
			for (var i = 0; i < tag_list.length; i++) {
				var t = tag_list[i].trim();
				if (t != '' && tags.indexOf(t) == -1) {
					tags.push(t);
				}
			}
			self.set_property('wof:tags', tags);
		},

		check_nearby: function() {

			if (self.disable_nearby_check) {
				return false;
			}

			var name = $('input[name="name"]').val();
			if (name == '') {
				return false;
			}

			$('#venue-response').html('
Checking for nearby duplicates...
');
			var center = self.map.getCenter();
			var method = 'wof.places.get_nearby';
			var args = {
				latitude: center.lat,
				longitude: center.lng,
				placetype: 'venue',
				name: name,
				per_page: 250
			};
			var onsuccess = function(rsp) {
				self.dupe_candidates = null;
				self.show_dupe_candidate(rsp.results);
			};
			var onerror = function(rsp) {
				$('#venue-response').html('
Oops, there was a problem checking for duplicates.
');
			};
			mapzen.whosonfirst.boundaryissues.api.api_call(method, args, onsuccess, onerror);
		},

		show_dupe_candidate: function(places, index) {
			if (! index) {
				index = 0;
			}
			if (! self.dupe_candidates) {
				// Cache the dupe candidates for 'next' button
				var dupes = self.get_dupe_candidates(places);
				self.dupe_candidates = dupes;
			} else {
				var dupes = self.dupe_candidates;
			}
			if (dupes.length > 0) {
				var place = dupes[index];

				if (! place['wof:id'] ||
				    ! place['wof:name']) {
					$('#venue-response').html('
Oops, there was a problem retrieving the duplicate records.
');
					return;
				}

				var wof_id = htmlspecialchars(place['wof:id']);
				var url = mapzen.whosonfirst.boundaryissues.utils.abs_root_urlify('/id/' + wof_id);
				var name = htmlspecialchars(place['wof:name']);

				var dupe_same_btn = '
' +
					'Same place' +
					'<button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">' +
					'' +
					'Toggle Dropdown' +
					'</button>' +
					'
' +
					'
Assign dupe by WOF ID...
' +
					'
' +
					'
';

				var dupe_next_btn = '';
				if (dupes.length > 1) {
					dupe_next_btn = 'Try next';
				}

				var dupe_assignment_callback = function() {
					$('#venue form').append('<input type="hidden" name="wof_id" id="wof_id" value="' + wof_id + '">');
					$('#dupe-merged').html('Your edits will be merged into the existing record. [undo]');
					$('#submit-btn').attr('value', 'Save venue');

					$('input[name="name"]').val(name);

					if ('addr:full' in place) {
						$('textarea[name="address"]').val(htmlspecialchars(place['addr:full']));
					}

					if ('wof:tags' in place) {
						var tags = htmlspecialchars(place['wof:tags']);
						tags = tags.replace(/,(\S)/g, ', $1');
						var new_tags = $('input[name="tags"]').val();
						if (new_tags) {
							if (tags) {
								tags += ', ';
							}
							tags += new_tags;
						}
						$('input[name="tags"]').val(tags);
					}

					check_for_wof_id();
					$('#dupe-undo').click(function(e) {
						e.preventDefault();
						self.set_wof_id(-1, function(rsp) {
							if (rsp.updated &&
							    rsp.updated.indexOf('wof_ids') !== -1) {
								$('#venue-response').html('');
								var assignments = check_for_assignments();
								if (assignments['wof:name']) {
									$('input[name="name"]').val(assignments['wof:name']);
								}
								if (assignments['addr:full']) {
									$('textarea[name="address"]').val(assignments['addr:full']);
								}
								if (assignments['wof:tags']) {
									$('input[name="tags"]').val(assignments['wof:tags']);
								}
								self.disable_nearby_check = false;
								self.check_nearby();
							}
						});
					});
				};

				var dupe_num = '(' + (index + 1) + ' of ' + dupes.length + ')';
				$('#venue-response').html('

Does this record exist already? This seems similar to:
' + name + ' ' + dupe_num + '

' + dupe_same_btn + ' ' + dupe_next_btn + ' Not a dupe

');
				$('#dupe-same').click(function(e) {
					e.preventDefault();
					self.set_wof_id(wof_id, dupe_assignment_callback);
				});
				$('#dupe-ignore').click(function(e) {
					e.preventDefault();
					$('#venue-response').html('');
				});
				$('#dupe-next').click(function(e) {
					e.preventDefault();
					index++;
					if (index == dupes.length) {
						index = 0;
					}
					self.show_dupe_candidate(places, index);
				});
				$('#dupe-assign').click(function(e) {
					e.preventDefault();
					var user_wof_id = prompt('Which WOF ID should we merge into?');
					user_wof_id = parseInt(user_wof_id);
					if (user_wof_id) {
						wof_id = user_wof_id;
						url = mapzen.whosonfirst.boundaryissues.utils.abs_root_urlify('/id/' + wof_id);
						var onerror = function() {
							mapzen.whosonfirst.log.error("Error fetching WOF record");
						};
						mapzen.whosonfirst.net.fetch(url + '.geojson', function(rsp) {
							var props = rsp.properties;
							name = props['wof:name'];
							self.set_wof_id(wof_id, dupe_assignment_callback);
							self.set_property('wof:hierarchy', props['wof:hierarchy']);
							self.set_property('wof:parent_id', props['wof:parent_id']);
						}, onerror);
					}
				});
			} else {
				$('#venue-response').html('');
			}
		},

		get_dupe_candidates: function(places) {

			var name = $('input[name="name"]').val();
			var stop_list = ['the'];
			var words = name.split(' ');
			var nearby = [];
			var ld, total_ld, place, place_words, place_word, word;

			// Yes, that's right, get ready for triple-nested for
			// loop! The short version is: check if any of words in
			// the name are within a levenshtein distance of 3 of
			// any place names near the given lat/lng.
			// (20170331/dphiffer)

			for (var i = 0; i < places.length; i++) {
				ld = 0;
				place = places[i];
				place_words = place['wof:name'].split(' ');
				for (var j = 0; j < place_words.length; j++) {
					place_word = place_words[j].toLowerCase();
					if (stop_list.indexOf(place_word) != -1) {
						continue;
					}
					for (var k = 0; k < words.length; k++) {
						word = words[k].toLowerCase();
						if (stop_list.indexOf(word) != -1) {
							continue;
						}
						ld = levenshteinDistance(word, place_word);
						if (ld < 3) {
							if (typeof place.total_ld == 'undefined') {
								place.total_ld = 0;
								nearby.push(place);
							}
						}
						if (typeof place.total_ld != 'undefined') {
							place.total_ld += ld;
						}
					}
				}
			}
			nearby.sort(function(a, b) {
				if (a.total_ld < b.total_ld) {
					return -1;
				} else if (b.total_ld < a.total_ld) {
					return 1;
				} else {
					return 0;
				}
			});
			return nearby;
		},

		set_wof_id: function(wof_id, success_cb, error_cb) {

			if ($('#csv_id').val() == '') {
				success_cb();
			}

			var data = {
				crumb: $('#venue').data('crumb-update-csv'),
				csv_id: $('#csv_id').val(),
				csv_row: $('#csv_row').val(),
				wof_id: wof_id
			};

			var onsuccess = function(rsp) {
				if (success_cb) {
					success_cb(rsp);
				}
			};

			var onerror = function(rsp) {
				if (error_cb) {
					error_cb(rsp);
				}
				mapzen.whosonfirst.log.error("error calling wof.update_csv");
			};

			$('#dupe-alert').remove();
			$('#venue-response').html('
Talking to the server...
');

			mapzen.whosonfirst.boundaryissues.api.api_call("wof.update_csv", data, onsuccess, onerror);
		}
	};

	function setup_map(bbox_init) {

		var scene = mapzen.whosonfirst.boundaryissues.utils.abs_root_urlify('/tangram/refill.yaml');
		mapzen.whosonfirst.leaflet.tangram.scenefile(scene);

		// For now we just assume everyone using BI can read English. This
		// should be configurable. (20170704/dphiffer)
		mapzen.whosonfirst.leaflet.tangram.scene_options({
			ux_language: 'en'
		});

		var map = mapzen.whosonfirst.leaflet.tangram.map_with_prefs('map', 'map_prefs', function(map, prefs) {

			self.map = map;
			map.on('moveend', self.update_coordinates);

			var hash = new L.Hash(map);

			var api_key = document.body.getAttribute("data-mapzen-api-key");
			var geocoder = L.control.geocoder(api_key, {
				markers: {
					icon: new VenueIcon()
				}
			}).addTo(map);
			geocoder.on('select', function(e) {
				geocoder.collapse();
				self.show_feature_pin(map, geocoder, e.feature);
			});

			L.control.locate().addTo(map);

			if (bbox_init) {
				mapzen.whosonfirst.boundaryissues.bbox.init(map);
			}

			var icon_url = mapzen.whosonfirst.boundaryissues.utils.abs_root_urlify('/images/marker-icon-2x.png');
			slippymap.crosshairs.init(map, {
				css: {
					'width': '25px',
					'height': '41px',
					'background': 'url("' + icon_url + '")',
					'background-size': '25px 41px',
					'margin-left': '-12px',
					'margin-top': '-41px',
					'z-index': 800
				}
			});
		});

		VenueIcon = L.Icon.extend({
			options: {
				iconUrl: mapzen.whosonfirst.boundaryissues.utils.abs_root_urlify('/images/marker-icon.png'),
				iconRetinaUrl: mapzen.whosonfirst.boundaryissues.utils.abs_root_urlify('/images/marker-icon-2x.png'),
				shadowUrl: null,
				iconAnchor: new L.Point(13, 42),
				iconSize: new L.Point(25, 42),
				popupAnchor: new L.Point(0, -42)
			}
		});
	}

	function setup_form() {

		function onsuccess(id) {
			if ($('#csv_id').val() != "") {
				var csv_id = $('#csv_id').val();
				var csv_row = parseInt($('#csv_row').val());
				var csv_row_count = parseInt($('#csv_row_count').val());
				if (csv_row == csv_row_count) {
					var redirect = mapzen.whosonfirst.boundaryissues.utils.abs_root_urlify('/csv/' + csv_id + '/');
				} else {
					var redirect = mapzen.whosonfirst.boundaryissues.utils.abs_root_urlify('/csv/' + csv_id + '/' + (csv_row + 1) + '/');
				}
				window.location = redirect;
			} else {
				var edit_url = mapzen.whosonfirst.boundaryissues.utils.abs_root_urlify('/id/' + id + '/');
				$('#venue-response').html('
Your venue has been saved. You can edit the WOF record or add another venue.
');
				self.reset_properties();
				window.scrollTo(0, 0);
				if (self.on_save) {
					self.on_save();
				}
			}
		}

		function onerror(rsp) {
			var message = '😿 There was a problem saving your venue.';
			if (rsp.error && rsp.error.message) {
				message = 'Oops! ' + htmlspecialchars(rsp.error.message);
			}
			$('#venue-response').html('
' + message + '
');
		}

		function save_venue() {
			$('#venue-response').html('
Saving venue...
');
			var geojson = self.generate_geojson();
			self.save_to_server(geojson, onsuccess, onerror);
		}

		$('#venue form').submit(function(e) {

			e.preventDefault();

			var parent_id = self.properties['wof:parent_id'];
			var hierarchy = self.properties['wof:hierarchy'];
			if ($('input[name="name"]').val() == '') {
				$('#venue-response').html('
Oops, you forgot to enter a name for your venue.
');
			} else if (! ('wof:hierarchy' in self.properties)) {
				self.update_coordinates();
				$('#venue-response').html('
Oops, the hierarchy has not been assigned. Try again in a moment?
');
			} else if (! ('wof:parent_id' in self.properties)) {
				self.update_coordinates();
				$('#venue-response').html('
Oops, the parent WOF ID has not been assigned. Try again in a moment?
');
			} else if (self.looking_up_hierarchy) {
				self.on_loaded_hierarchy = save_venue;
			} else {
				save_venue();
			}
		});

		$('input[name="name"]').change(self.update_name);
		$('textarea[name="address"]').change(self.update_address);
		$('input[name="tags"]').change(self.update_tags);
	}

	function setup_address() {
		$('#venue-lookup-address').click(function(e) {
			e.preventDefault();
			var address = $('textarea[name="address"]').val();
			var ll = address.match(/(-?\d+\.?\d*)\s*,\s*(-?\d+\.?\d*)/);
			if (ll) {
				var lat = parseFloat(ll[1]);
				var lng = parseFloat(ll[2]);
				self.map.setView([lat, lng], 16);
				$('textarea[name="address"]').val('');
				self.check_nearby();
			} else {
				self.geocode_address(address);
			}
		});
	}

	function setup_preview() {
		$('#property-preview-link').click(function(e) {
			e.preventDefault();
			$('#property-preview').toggleClass('visible');
			if ($('#property-preview').hasClass('visible')) {
				var html = '
';
				var keys = Object.keys(self.properties);
				keys.sort();
				$.each(keys, function(i, key) {
					var value = self.properties[key];
					if (typeof value == 'object') {
						value = JSON.stringify(value);
					}
					html += '
';
					html += '' + htmlspecialchars(key) + '	';
					html += '' + htmlspecialchars(value) + '	';
					html += '
';
				});
				html += '
';
				$('#property-preview').html(html);
			}
		});
	}

	var geotagged_index;
	var geotagged_num;

	function setup_geotagged() {
		var geotagged_id = location.search.match(/geotagged_\d+/);
		if (! geotagged_id) {
			return;
		}
		geotagged_id = geotagged_id[0];
		mapzen.whosonfirst.geotagged.load_index(function(index) {
			geotagged_index = index;
			for (var i = 0; i < index.geotagged_ids.length; i++) {
				if (index.geotagged_ids[i] == geotagged_id) {
					geotagged_num = i;
				}
			}
			if (typeof geotagged_num != 'number') {
				var url = mapzen.whosonfirst.boundaryissues.utils.abs_root_urlify('/geotagged/');
				var header = 'Geotagged photo
';
				$('#venue-geotagged').html(header + 'Could not find the specified geotagged photo :(');
				$('#venue-geotagged').removeClass('hidden');
				return;
			}
			show_geotagged(geotagged_num);
		});
	}

	function show_geotagged(num) {

		// Oh hey, let's talk about iOS & EXIF orientation modes!
		//
		// Yes, browser sniffing is bad and shameful, but iOS insists on
		// behaving differently from other OS's when it comes to EXIF
		// orientation modes. Arguably its behavior is the "correct" one
		// (it auto-rotates images compensating for the EXIF orientation
		// mode) but ... NO OTHER OS OR BROWSER DOES THAT. So iOS gets
		// the sniff treatment. To complicate things a little more, iOS
		// only rotates  tags, not background images. Go figure.
		//
		// Based on: https://stackoverflow.com/a/9039885/937170
		// See also: https://phiffer.org/etc/exif-orientation-test/
		//
		// (20170724/dphiffer)

		function is_ios() {

			var iDevices = [
				'iPad Simulator',
				'iPhone Simulator',
				'iPod Simulator',
				'iPad',
				'iPhone',
				'iPod'
			];

			if (!! navigator.platform) {
				while (iDevices.length) {
					if (navigator.platform === iDevices.pop()) {
						return true;
					}
				}
			}

			return false;
		}

		geotagged_num = num;
		var id = geotagged_index.geotagged_ids[geotagged_num];
		var geotagged_count = geotagged_index.geotagged_ids.length;
		mapzen.whosonfirst.geotagged.load_photo(id, function(photo) {

			if ($(window).width() < 480) {
				$('#venue-geotagged').addClass('one-column');
			}

			var url = mapzen.whosonfirst.boundaryissues.utils.abs_root_urlify('/geotagged/');
			var header = 'Geotagged photo
';
			var nav = ' prev';
			nav += '' + (geotagged_count - geotagged_num) + ' of ' + geotagged_count + '';
			nav += 'next ';

			if (geotagged_count == 1) {
				nav = '';
			}

			if (photo.geotags) {
				var ll = [photo.geotags.latitude, photo.geotags.longitude];
				self.map.setView(ll, 17);
				self.update_coordinates();
				var status = '' + photo.geotags.latitude.toFixed(6) + ', ' + photo.geotags.longitude.toFixed(6) + '';
			} else {
				var status = 'No geotags found in photo
';
			}
			status = '
' + status + '
';

			var orientation = photo.orientation;
			if (is_ios()) {

				// See comment above about iOS & EXIF orientation modes.

				orientation = '';
			}

			var img_tag = '';
			var img = '
' + img_tag + '
';
			var controls = '
' + header + nav + '

';
			var zoom_close = '

';
			var zoom = '

' + img_tag + zoom_close + '

';

			$('#venue-geotagged').html(img + controls + status + zoom);
			$('#venue-geotagged').removeClass('hidden');
			$('#venue-geotagged-zoom img').removeClass('thumbnail');

			$('#venue-geotagged-img').click(function(e) {
				$(document.body).addClass('no-scroll');
				$('#venue-geotagged-zoom').removeClass('hidden');
				var h = $('#venue-geotagged-zoom img').height();
				var wh = $(window).height();
				if (h < wh) {
					$('#venue-geotagged-zoom img').css('margin-top', (wh - h) / 2);
				}
			});

			$('#venue-geotagged-zoom-close').click(function() {
				$('#venue-geotagged-zoom').addClass('hidden');
				$(document.body).removeClass('no-scroll');
			});

			var ratio;
			if (photo.exif) {
				ratio = photo.exif.PixelXDimension / photo.exif.PixelYDimension;
			}
			var w = $('#venue-geotagged-img').width();

			if (is_ios()) {

				// See comment above about iOS & EXIF orientation modes.

				$('#venue-geotagged-img, #venue-geotagged-controls').css('height', 'auto');
				$('#venue-geotagged').addClass('static');
			} else if (photo.orientation && ratio) {
				if (photo.orientation.indexOf('rotate-90') != -1) {
					var h = Math.round(w * ratio);
					$('#venue-geotagged-img img').css('transform', 'translate3d(-50%, -50%, 0) rotate(90deg) scale(' + ratio + ')');
				} else if (photo.orientation.indexOf('rotate-180') != -1) {
					var h = Math.round(w / ratio);
					$('#venue-geotagged-img img').css('transform', 'translate3d(-50%, -50%, 0) rotate(180deg)');
				} else if (photo.orientation.indexOf('rotate-270') != -1) {
					var h = Math.round(w * ratio);
					$('#venue-geotagged-img img').css('transform', 'translate3d(-50%, -50%, 0) rotate(270deg) scale(' + ratio + ')');
				}
			} else if (ratio) {
				var h = Math.round(w / ratio);
				$('#venue-geotagged-img img').css('transform', 'translate3d(-50%, -50%, 0)');
			}

			if (h) {
				$('#venue-geotagged-img').css('height', h);
				$('#venue-geotagged').removeClass('static');
				if (! $('#venue-geotagged').hasClass('one-column')) {
					$('#venue-geotagged-controls').css('height', h);
				}
			} else {
				$('#venue-geotagged-img, #venue-geotagged-controls').css('height', 'auto');
				$('#venue-geotagged').addClass('static');
			}
			if (geotagged_num > 0) {
				$('#venue-geotagged-next').addClass('active');
			}
			if (geotagged_num < geotagged_count - 1) {
				$('#venue-geotagged-prev').addClass('active');
			}
			$('#venue-geotagged-next').click(function(e) {
				if (! $('#venue-geotagged-next').hasClass('active')) {
					return;
				}
				show_geotagged(geotagged_num - 1);
				update_geotagged_url();
			});
			$('#venue-geotagged-prev').click(function(e) {
				if (! $('#venue-geotagged-prev').hasClass('active')) {
					return;
				}
				show_geotagged(geotagged_num + 1);
				update_geotagged_url();
			});
		});

		function update_geotagged_url() {
			var id = geotagged_index.geotagged_ids[geotagged_num];
			var state = {
				geotagged_id: id
			};
			var url = '?' + id + location.hash;
			history.pushState(state, document.title, url);
		}

		self.on_save = function() {
			if (geotagged_num < geotagged_count - 1) {
				show_geotagged(geotagged_num + 1);
			}
		};
	}

	function check_for_wof_id() {

		if ($('#wof_id').length == 0) {
			return false;
		}

		self.disable_nearby_check = true;
		var wof_id = $('#wof_id').val();

		var onsuccess = function(rsp) {
			properties = rsp.properties;
			self.properties = properties;
			var lat = parseFloat(properties['geom:latitude']);
			var lng = parseFloat(properties['geom:longitude']);
			self.map.setView([lat, lng], 16);
			check_for_assignments();
			self.update_name();
			self.update_address();
			self.update_tags();
		};

		var onerror = function(rsp) {
			mapzen.whosonfirst.log.error("unable to load WOF ID " + wof_id + ' from local repo');
			$('#dupe-merged').html('Error could not find data for WOF ID ' + wof_id + '.');
			$('#dupe-merged').removeClass('alert-info');
			$('#dupe-merged').addClass('alert-danger');
		};

		var path = '/id/' + wof_id + '.geojson';
		var url = mapzen.whosonfirst.boundaryissues.utils.abs_root_urlify(path);
		mapzen.whosonfirst.net.fetch(url, onsuccess, onerror);

		return true;
	}

	function check_for_assignments() {
		var $properties = $('input.property');
		if ($properties.length == 0) {
			return null;
		}
		var assignments = {};
		$properties.each(function(i, input) {

			var key = $(input).attr('name');
			var value = $(input).val();

			if (key == 'edtf:cessation') {
				if (value == '') {
					value = 'uuuu';
				} else {
					self.set_property('mz:is_current', 0);
				}
			} else if (key.substr(0, 13) == 'Concordance: ') {
				var concordance_id = key.substr(13);
				key = 'wof:concordances';
				var concordances = self.properties[key];
				if (! concordances) {
					concordances = {};
				}
				concordances[concordance_id] = value;
				value = concordances;
			} else if (key.substr(0, 8) == 'Custom: ') {
				key = key.substr(8);
			}

			assignments[key] = value;
			self.set_property(key, value);
		});

		if (assignments['geom:latitude'] &&
		    assignments['geom:longitude']) {
			var lat = parseFloat(assignments['geom:latitude']);
			var lng = parseFloat(assignments['geom:longitude']);
			self.map.setView([lat, lng], 16);
			self.lookup_hierarchy({
				lat: lat,
				lng: lng
			});
			self.check_nearby();
		} else if (assignments['addr:full']) {
			self.geocode_address(assignments['addr:full'], function() {
				self.check_nearby();
			});
		} else if ($('textarea[name="address"]').val() != '') {
			var addr = $('textarea[name="address"]').val();
			self.geocode_address(addr, function() {
				self.check_nearby();
			});
		} else {
			console.log('We are on null island');
		}

		return assignments;
	}

	$(document).ready(function() {
		if ($('#venue').length > 0) {

			// Check if we arrived by a URL like this: /add/?ll=123,456
			// which redirects to: /add/#16/123/456
			var ll = location.search.match(/ll=([^&]+)/);
			if (location.pathname.match(/add\/?$/) && ll) {
				window.location = location.pathname + '#16/' + ll[1].replace(',', '/');
				return;
			}

			var bbox_init = ($('#csv_id').val() == "");
			setup_map(bbox_init);
			setup_form();
			setup_address();
			setup_preview();
			setup_geotagged();
			if (! check_for_wof_id()) {
				check_for_assignments();
			}
			self.update_name();
			self.update_address();
			self.update_tags();
		}
	});

	return self;

})();

redpajama_set_name: RedPajamaGithub


Dr Anjali Mukerjee, founder and India's leading nutritionist also Health Expert.
Water with hand full of rock salt should be used to take vapours in severe cough or mild could and heaviness in the head.
Morning walk reduces the risk of heart attack and stroke. It improves the circulation of blood, also reduces type 2 diabetes risk.
Orange works well for treating common cold, and cough, and is able to manage all the simple symptoms of illness. Orange is well known mainly for the vitamin C it provides..
Foods to avoid in the Winter Season. If you have a sore throat or a raspy voice, drinking or eating very cold foods like ice cream can make things much worse.
Food To Heal - Orange.
Grow Health is dedicated to delivering accurate, trusted, up-to-date health and medical information, for Everyone.
Grow Health offer information that will help living healthy.


text:
Home News FG Congratulates Mo Abudu Over Netflix Deal
FG Congratulates Mo Abudu Over Netflix Deal
Tunji Oyeyemi
Mo Abudu
The Federal Government has congratulated media entrepreneur and filmmaker Mo Abudu over her partnership with leading global streaming service Netflix to create two original series as well as multiple Netflix-branded films.
In a statement issued in Abuja on Friday, the Minister of Information and Culture, Alhaji Lai Mohammed, said the partnership, for on-screen adaptation of Wole Soyinka's 'Death and The King's Horseman' and Lola Shoneyin's 'The Secret Lives of Baba Segi's Wives', adds another feather to Mo Abudu's already well-adorned creative cap.
The Minister also described the deal as a big boost for the country's Creative Industry, at a time the industry is reeling from the negative effects of the Covid-19 pandemic.
"Coming after Netflix's first Nigeria original film, Lionheart, this is a great recognition of the immense creative talents that abound in Nigeria and the provision of a global platform for Nigeria storytelling," he said.
Alhaji Mohammed expressed the hope that this partnership will signal the beginning of a bigger, mutually-beneficial working relationship between the streaming service and Nigeria's Creatives.
Segun Adeyemi
Special Assistant To The President (Media)
Office of The Minister of Information and Culture
Previous articleExperience shows 45% COVID-19 patients are asymptomatic says Health Minister
Next articleHighlight of response by Honourable Minister of Health, Dr. Osagie Ehanire to questions from journalists during the Presidential Task Force on COVID-19 Press Briefing held on Thursday, June 11, 2020
Minister of State for Health Commissions Critical Care Facilities at LUTH
Nigeria Decimating Terrorists, Bandits – Minister
FIIRO IS A GREAT ASSET TO NIGERIA –FG

redpajama_set_name: RedPajamaCommonCrawl


text:
A classroom at a new middle school in Kelowna opened August 2019. (B.C. government)
B.C. teachers vote to accept same pay increase as other unions
Negotiations with BCTF dragged on for a year
After a year demanding more than the two-per-cent cap on annual public union contracts, members of the B.C. Teachers' Federation have accepted a three-year contract.
The union abruptly agreed to the terms of the contract March 27, after the education ministry announced it was suspending classroom instruction due to the COVID-19 pandemic. The finance ministry announced the ratification May 1, for a a three-year term retroactive to July 1, 2019.
The new deal exceeds the two per cent raise cap in one area, including a one per cent increase this year for the highest-paid teachers in each of B.C.'s 60 school districts.
RELATED: BCTF rejects mediator's recommended settlement
RELATED: BCTF says teachers will work after spring break
The settlement of the BCTF dispute means about 90 per cent or 300,000 public sector union members are covered by tentative or ratified agreements under what Finance Minister Carole James calls the "sustainable services negotiating mandate."
Education Minister Rob Fleming has said B.C. public schools are increasing the number of children of essential workers being offered classroom instruction this spring, but full classroom instruction isn't expected until fall.
Wet'suwet'en elected chiefs call for withdrawal of 'premature' agreement on rights and title
Read Island folks might buy a forest for the third time